2012-06-28 46 views
3

我想一个ALT-S发送到一个对话框,提示保存使用PostMessage的文件:发送ALT-S的一个窗口

PostMessage(h, WM_KEYDOWN, VK_MENU, 0); 
PostMessage(h, WM_KEYDOWN, ord('S'), 0); 
PostMessage(h, WM_KEYUP, ord('S'), 0); 
PostMessage(h, WM_KEYUP, VK_MENU, 0);

但它不工作。它发送两个密钥,但好像ALT条件不被对话框识别,并作为普通的S字符处理。

我已经做了大量的阅读,其中包括this(这产生了一个错误),似乎我需要在lparam中做些事情来表明ALT被抑制。有些消息来源说0x20000000,但这也不起作用。

SendInput,keybd_event等将不适用于我,因为对话框将不会被聚焦。

我很难过会欣赏一些见解。

+0

如果用户没有运行您所使用的操作系统的版本或语言版本会怎么样?你怎么知道标签实际上叫'&Save'? –

+0

谢谢,但这不是一个因素。这是一个特定客户端的非常专业的应用程序。 –

+3

伪造键盘输入是做这件事的难办法。简单地发送一个WM_COMMAND消息到按钮窗口会容易得多。 –

回答

0

到现在为止,按另一个窗体上按钮的最简单的方法是发送WM_COMMAND消息,而不是伪造的输入。伪造投入是一件棘手的事情,往往可能无法做到您的愿望。

发送WM_COMMAND到顶层窗口。通知代码BN_CLICKEDwParam,按钮ID为lParam

您可以使用FindWindowEnumWindows来获取顶级窗口的句柄。像Spy ++这样的程序可以让你找到目标按钮的ID。

+0

感谢大卫,但我敢肯定,这是要走的路,我没有得到任何结果发送到BN_CLICKED按钮ID和顶层窗口的句柄。通过“顶级”窗口 - 你的意思是主要形式? IE没有产生我感兴趣的按钮对话框的对话框,但主要形式的EXE?我已经使用两种建议的方法(UI SPy(该死的很难过))和EnumWindows确认了正确的ID。 –

+0

一些对话框实现方式不同,但一个标准的Win32/MFC类型对话框将期望'WM_COMMAND'被发送到按钮的父控件。你可以找到哪些是间谍的父母。一个窍门是监视间谍中的消息,然后单击按钮。看看哪些消息发送到哪里,哪些可以帮助您调试如何按下此dratted按钮! –

+0

嗨大卫感谢您的帮助如此之久。我再次采取了这个,仍然没有运气。我找不到Spy ++作为单独的下载,我正在使用UISpy并可以看到按钮的ID。例如,如果我将文件保存为NOTpad,则会显示另存为对话框。那里有一个按钮,ID = 1。如果我发送WM_COMMAND,BN_CLICKED给它,没有任何反应。这是直接的父母是记事本。如果我将它发送到记事本窗口也没有任何反应。但是,如果我用一个按钮编写我自己的应用程序,它的魅力!关于windows的GUI有什么特别之处? –

1

试试这个:

PostMessage(h, WM_SYSKEYDOWN, VK_MENU, 0); 
PostMessage(h, WM_KEYDOWN, ord('S'), 0); 
PostMessage(h, WM_KEYUP, ord('S'), 0); 
PostMessage(h, WM_SYSKEYUP, VK_MENU, 0); 
+1

不要忘了“上一键状态”和'LPARAM'参数的“过渡状态”位均设置为1的KEYUP消息。 –

+0

@RemyLebeau谢谢,我无法弄清楚它在LPARAM词中的位。你能否指点我一个资源? –

+0

对不起,Vahid不行。 –

相关问题