将Windows key keypress发送到应用程序

时间:2012-08-27 23:02:24

标签: c# .net vb.net keyboard-shortcuts keyboard-events

  

可能重复:
  How to detect the currently pressed key?

(编辑:对于它的价值,这不重复......不确定为什么会这样投票)

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

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

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

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

我感谢任何帮助或方向!

编辑 - 回复更新

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

Public Const MOD_WIN As Integer = &H8
Public Const KEY_W As Integer = &H57

<DllImport("user32.dll")> _
Public Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As Integer, vlc As Integer) As Boolean
End Function

<DllImport("user32.dll")> _
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

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

3 个答案:

答案 0 :(得分:3)

如果想要完整的操作系统集成,可以使用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;
}

答案 1 :(得分:2)

我还建议查看自动热键: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."

答案 2 :(得分:1)

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