WM_HOTKEY可以用来模拟热键事件吗?

时间:2011-06-01 12:40:23

标签: c++ winapi

在我的程序(C ++,WinAPI)中,我想模拟按下其他正在运行的程序中设置的一些现有热键。我知道有一个模拟键盘输入的SendInput函数,但它似乎太多了,因为它需要为键创建很多结构。

我尝试使用HWND_BROADCAST和WM_HOTKEY参数来使用SendMessage PostMessage 。两者都没有。

代码如下所示:

WORD hotkey = MAKEWORD(MOD_CONTROL, VK_SPACE); // Ctrl + Space

SendMessage( HWND_BROADCAST,
             WM_HOTKEY,
             (WPARAM)hotkey , 0);

我是否在正确的轨道上?或者这应该以不同的方式完成?

2 个答案:

答案 0 :(得分:1)

诚实地,SendInput是最好的答案。这是因为在消息循环中,您对traslateaccellerator的调用将查看消息,并且在该消息中,LPARAM上有一个标记,指示用该键按下了哪些其他键。你不想要自己填写那个位标志,但是.....以防你做..并且不想使用SendInput ... http://msdn.microsoft.com/en-us/library /ms646280%28VS.85%29.aspx详细介绍了如何操作。当然,如果您想使用AcceleratorTable,只需在资源编辑器中轻松完成,就在您的消息循环中,请使用此http://msdn.microsoft.com/en-us/library/ms646373%28VS.85%29.aspx

进行连接。

答案 1 :(得分:1)

使用类似WM_HOTKEY的HWND_BROADCAST。实际上,除非在您确实想要向每个窗口广播消息的情况下,否则请避免使用HWND_BROADCAST。如果其他窗口处理您的消息,您将遇到难以置信的麻烦。

你也在使用WM_HOTKEY错误。 wParam不包含两个键的HIWORD / LOWORD。程序员使用RegisterHotKey分配热键,它们传递一个标识符,以及生成带有该标识符的WM_HOTKEY消息的热键。

您可以通过多种方式找到此标识符,该标识符应该是您的wParam。首先,你可以在RegisterHotKey()上调试目标和断点,直到找到你想要的那个。或者,您可以使用Spy ++并定位窗口并检查标识符是什么。

当然有可能热键不通过热键工作,而是键盘加速器。您需要按照类似的步骤找到当您按下该按钮时目标接收的WM_COMMAND或WM_SYSCOMMAND的参数。我的建议是使用Spy ++。