将Windows密钥按键发送到应用程序

可能重复:
如何检测当前按下的键?

(编辑:对于它的价值,这不是重复……不确定为什么它被投票如此)

我有一个小型计时器应用程序,我们在办公室使用它来跟踪项目花费的时间。 有一个开始和停止按钮,一个项目和任务字段。 当我们继续rest,午餐和其他事情时,我们停止该项目的计时器,然后重新启动它。 这是一个重复性的任务,通常涉及从其他几个窗口后面挖出窗口,然后在rest后将窗口挖出。

我想要做的是将WindowKey + W分配给工作计时器应用程序,让它不仅将计时器应用程序放在前面并将其聚焦,而且还让它切换启动/停止。

我尝试了一些搜索,但我似乎无法将示例缩小到我想要的范围。 我知道你可以打开Windows快捷方式的属性并分配一个快捷键来启动一个程序,并且(我猜?)如果你已经打开了该应用程序并且它被设置为只允许一个程序实例将该计划带到前面??? 也许..

无论如何..但该方法不会接受WindowsKey作为有效的密钥组合。 而且我不知道它是否可以某种方式将该关键组合传递给该程序。

我感谢任何帮助或方向!

编辑 – 回答更新

谢谢你@huadianz的回答! 我将您的代码转换为VB:

Public Const MOD_WIN As Integer = &H8 Public Const KEY_W As Integer = &H57  _ Public Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As Integer, vlc As Integer) As Boolean End Function  _ Public Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As Boolean End Function Public Sub RegisterKeys() RegisterHotKey(Me.Handle, 1, MOD_WIN, KEY_W) End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) MyBase.WndProc(m) If (m.Msg = &H312) Then Me.TopMost = True Me.PlayPauseTimer() Me.TopMost = False End If End Sub 

有趣的是,在Win7中, Me.Focus()实际上不会将应用程序带到前端, Me.BringToFront()也不会。 但是, Me.TopMost = True工作,但它具有使窗口始终位于顶部的次要效果。 将其设置为True ,切换计时器,然后将其设置回False非常有用!

如果需要完整的操作系统集成,可以使用PInvoke挂钩内核输入函数。

您正在寻找的是explorer.exe Windows API函数,在此处详细介绍:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx

使用PInvoke,您可以调用此C ++函数

 [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); public const int MOD_WIN = 0x00000008; public const int KEY_W = 0x00000057 public static void RegisterKeys() { RegisterHotKey((IntPtr)this.Handle, 1, MOD_WIN, KEY_W); } protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x0312) this.Visible = !this.Visible; } 

我还建议看一下Auto Hotkey: http : //www.autohotkey.com/ 。 如果您只是在按键时向前发送一个窗口,那么您可能会发现学习AHK并写一个脚本(只有1或2行)比用C#或VB写一些东西更快。

*编辑*关于自动按下按钮,如果将其设置为默认按钮,则可以将输入击键发送给它。 否则,您甚至可能需要向窗口发送鼠标。 完成第一部分后,两者都不是特别困难。

#W::MsgBox "This is a message box. You just need to use something like send to send keystrokes and other commands to the window you want to control, instead of the this message box."

您可以使用Windows SendKeys 。 如果你查看该链接,它会显示应用ctrl,alt或shift键的代码和语法。 我想你可以将这些键发送到你的应用程序来模拟快捷键。