c# - 将 Windows 按键发送到应用程序

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

<分区>

Possible Duplicate:
How to detect the currently pressed key?

(编辑:就其值(value)而言,这不是重复的......不确定为什么这样投票)

我有一个小型计时器应用程序,我们在办公室使用它来跟踪在一个项目上花费的时间。有一个开始和停止按钮,以及一个项目和任务字段。当我们去休息、吃午饭和做其他事情时,我们会停止那个项目的计时器,然后重新启动它。这是一项重复性的工作,通常涉及从其他几扇 window 后面挖出 window ,然后在休息后继续这样做。

我想要做的是将 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

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

最佳答案

如果您想要完整的操作系统集成,您可以使用 PInvoke Hook 到内核输入函数。

您正在寻找的是 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;
}

关于c# - 将 Windows 按键发送到应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12150758/

相关文章:

c# - 如何释放多个进程之间共享的套接字描述符?

c# - Dictionary of Dictionaries的扩展方法

c# - 从字符串 xml 中获取节点值

.net - 是/否消息框总是返回是 - VB.Net

c# - 如何将图像从剪贴板保存到 UWP 中的文件

c# - 如何从 Web.config 获取键的转换值

java - 从blackberry eclipse项目调用.NET Web服务错误

c# - 通过 .NET 使用 uTorrent Web API

c# - Xamarin.iOS 和 Xamarin.Android 的 NuGet 包缩写是什么?

vb.net - 在 vb.net 中动态更改按钮背景颜色