4

重複の可能性:
現在押されているキーを検出する方法は?

(編集:価値があるので、これは重複ではありません...なぜそのように投票されたのかわかりません)

プロジェクトに費やされた時間を追跡するためにオフィスで使用する小さなタイマー アプリケーションがあります。開始ボタンと停止ボタン、プロジェクト フィールドとタスク フィールドがあります。休憩や昼食などに行くときは、そのプロジェクトのタイマーを停止してから、再開します。これは、通常、他のいくつかの窓の後ろから窓を掘り出し、休憩後に同じことを行う反復作業です。

私がやりたいことは、作業タイマー アプリケーションに 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うまくいきます!

4

3 に答える 3

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;
}
于 2012-08-27T23:35:32.167 に答える
2

Auto Hotkey: http://www.autohotkey.com/も参照することをお勧めします。キーを押したときにウィンドウを最前面に送信することだけを目的としている場合は、C# や VB で何かを記述するよりも、AHK を学習してそのためのスクリプトを記述した方が (1 行または 2 行で) 速くなることがあります。

*編集*ボタンを自動的に押すことに関しては、それがデフォルトのボタンとして設定されている場合、エンターキーストロークをそれに送信するだけです。それ以外の場合は、マウス クリックをウィンドウに送信する必要がある場合があります。最初の部分が完了したら、どちらも特に難しいことはありません。

#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."

于 2012-08-27T23:12:16.923 に答える
0

Windows SendKeysを使用できます。そのリンクを見ると、ctrl、alt、または shift キーを適用するためのコードと構文が示されています。これらのキーをアプリケーションに送信して、ショートカットの押下をシミュレートできると思います。

于 2012-08-27T23:07:23.173 に答える