【发布时间】:2012-08-22 11:01:14
【问题描述】:
(编辑:对于它的价值,这不是重复的......不知道为什么会这样投票)
我有一个小型计时器应用程序,我们在办公室使用它来跟踪项目花费的时间。有一个开始和停止按钮,以及一个项目和任务字段。当我们休息、吃午饭和其他事情时,我们会停止该项目的计时器,然后重新启动它。这是一项重复性的任务,通常涉及从其他几个窗口后面挖出窗口,然后在休息后做同样的事情。
我想要做的是将 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 效果很好!
【问题讨论】:
-
检查 WINAPI。您可以注册热键。
-
在问我之前我确实读过这个问题。问题的重点是应用程序当前处于活动状态的时间。问题的重点不是我要找的,所以我觉得需要另一个问题。
标签: c# .net vb.net keyboard-shortcuts keyboard-events