2011-01-21 83 views
0

我试图打印字母“a”从我的应用程序的活动窗口:SendMessage函数不起作用从C#

[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); 
} 

但是信没有出现在活动窗口(任何应用程序)。有谁能够帮助我?

回答

2

发送WM_KEYDOWN和WM_KEYUP不起作用,特别是对于字符键。应用程序的消息泵将调用TranslateMessage,为这些键生成WM_CHAR。应用程序查找字符输入通常是WM_CHAR。

注入输入的正确方法是使用SendInput函数。

这里是一个SendInput wrapper我发现通过谷歌搜索。

+0

感谢您的回复。我发现了[DllImport(“user32.dll”)] public static extern void keybd_event(byte bVk,byte bScan,uint dwFlags,uint dwExtraInfo); – 2011-01-24 08:50:29

2

您必须使用PostMessage,而不是SendMessage。您的pinvoke声明也是错误的,返回值和最后2个参数是IntPtr,而不是int。

最终的失败是您无法控制修改键Ctrl,Shift和Alt的状态。这使得随机失败,取决于用户是否按下了其中一个键。 SendInput是必需的,现在迫使你也通过SetForegroundWindow()获得正确的焦点。在Winforms应用程序中使用SendKeys。

要注入键入键,您可以使用SendMessage()发送WM_CHAR。

+0

SendKeys的+1。当然,在OP的上一个问题中,他建议不要使用SendKeys,而应该使用SendMessage将文本直接戳到编辑框中,大概是用WM_SETTEXT。但OP似乎误解了这个...... – 2011-01-21 16:47:19