2011-10-11 124 views
1

我有這樣的代碼:PostMessage WM_KEYDOWN發送多個密鑰?

public static void Next() 
    { 
     Process[] processes = Process.GetProcessesByName("test"); 

     foreach (Process proc in processes) 
      PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0); 
    } 

此代碼sents右箭頭鍵,我想送ALT + CTRL + RIGHT我想這:

public static void Forward() 
    { 
     Process[] processes = Process.GetProcessesByName("test"); 

     foreach (Process proc in processes) 
     { 
      PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_CONTROL, 0); 
      PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_ALT, 0); 
      PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0); 
     } 
    } 

但它不工作.. 。

任何想法?

回答

4

You can't simulate keyboard input with PostMessage,至少不可靠地使用SendInput來代替。

+1

+1我改正了你的鏈接,顯然你的意思是指向Raymond的文章。 –

+0

@DavidHeffernan - 是的,我做了,謝謝 – shf301

+0

我試着理解SendInput上的例子,但沒有任何成功。 我需要將Key發送到在我的電腦上運行的非關注進程,而不是從我的鍵盤, ,如按鈕點擊 – Danpe

1

我已經嘗試了這麼多次,如果它有效,它會被擊中或錯過。你想要做的是嘗試使用WM_SYSKEYDOWN而不是WM_KEYDOWN作爲「系統」類型的鍵。這也意味着你必須使用WM_SYSKEYUP。像這樣的東西可能會奏效:

PostMessage(proc.MainWindowHandle, WM_SYSKEYDOWN, VK_CONTROL, 0); 
PostMessage(proc.MainWindowHandle, WM_SYSKEYDOWN, VK_ALT, 0); 
PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_RIGHT, 0); 
PostMessage(proc.MainWindowHandle, WM_SYSKEYUP, VK_ALT, 0); 
PostMessage(proc.MainWindowHandle, WM_SYSKEYUP, VK_CONTROL, 0); 

更新:

我就把它只能模擬單鍵按鍵,它最小化應用:)偉大工程,甚至。當用它作爲「移位」狀態的組合鍵時,它就是被擊中或錯過的地方。問題是大多數Windows應用程序都有一個控件,並且每個控件都有它的句柄,所以向窗口發送一個鍵不會產生所需的影響,您必須將ALT + S發送到「菜單」句柄以進行文件保存在記事本中),這也有效。

+0

它不起作用:-( – Danpe

+0

是的,它不會使用SendInput,或者更好的UI自動化。 –