2011-10-11 125 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自动化。 –