2011-01-21 81 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