重複の可能性:
現在押されているキーを検出する方法は?
(編集:価値があるので、これは重複ではありません...なぜそのように投票されたのかわかりません)
プロジェクトに費やされた時間を追跡するためにオフィスで使用する小さなタイマー アプリケーションがあります。開始ボタンと停止ボタン、プロジェクト フィールドとタスク フィールドがあります。休憩や昼食などに行くときは、そのプロジェクトのタイマーを停止してから、再開します。これは、通常、他のいくつかの窓の後ろから窓を掘り出し、休憩後に同じことを行う反復作業です。
私がやりたいことは、作業タイマー アプリケーションに WindowKey+W を割り当て、タイマー アプリケーションを前面に移動してフォーカスするだけでなく、開始/停止を切り替えることです。
いろいろ検索してみましたが、例を自分の欲しいものに絞り込めないようです。Windows ショートカットのプロパティを開いて、ショートカット キーを割り当ててプログラムを起動できることは知っていますが、(推測では?) そのアプリを既に開いていて、プログラムのインスタンスを 1 つだけ許可するように設定されている場合は、そのプログラムを前面に出しますか??? 多分..
とにかく..しかし、そのメソッドは有効なキーの組み合わせとして 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
うまくいきます!