我正在尝试在我的应用程序的活动窗口上打印字母“a”:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
...
// global hotkey handler
void hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
var hWnd = GetForegroundWindow();
SendMessage(hWnd, (uint)WM.KEYDOWN, (int)VK.KEY_A, 0);
SendMessage(hWnd, (uint)WM.KEYUP, (int)VK.KEY_A, 0);
}
但是信件没有出现在活动窗口中(对于任何应用程序)。有人能帮助我吗?
答案 0 :(得分:2)
发送WM_KEYDOWN和WM_KEYUP不起作用,尤其是对于字符键。应用程序的消息泵调用TranslateMessage,它为这些键生成WM_CHAR。应用程序通常在WM_CHAR中查找字符输入。
注入输入的正确方法是使用SendInput函数。
这是我通过Google搜索找到的SendInput wrapper。
答案 1 :(得分:2)
您必须使用PostMessage,而不是SendMessage。您的pinvoke声明也是错误的,返回值和最后两个参数是IntPtr,而不是int。
最终的失败是您无法控制修改键的状态,Ctrl,Shift和Alt。这使得它随机失败,这取决于用户是否按下其中一个键。需要SendInput,迫使您现在也可以通过SetForegroundWindow()获得正确的焦点。在Winforms应用程序中使用SendKeys。
要注入输入键,您可以使用SendMessage()发送WM_CHAR。