2017-07-15 12 views
0

グローバルホットキーを作成しましたが、最初はうまくいきました。しかし、フォームにいくつかのデザインを追加したり、余分なコードを追加したりすると、もう動作しません。その後、私は基本に戻り、元のコードに追加されたコードをコメントアウトしますが、まだ運がありません。相続人コード:C#グローバルホットキーを修正

ホットキークラスコード: クラスホットキー {

public enum fsModifers 
    { 
     Alt = 0x0001, 
     Control = 0x0002, 
     Shift = 0x0004, 
     Window = 0x0008, 
    } 

    IntPtr hWnds; 

    public HotKeys(IntPtr hWnd) 
    { 
     this.hWnds = hWnd; 
    } 

    public void RegisterHotKeys() 
    { 
     RegisterHotKey(hWnds, 1, (uint)fsModifers.Control, (uint)Keys.T); 
     RegisterHotKey(hWnds, 2, (uint)fsModifers.Control, (uint)Keys.R); 
    } 

    public void UnregisterHotKeys() 
    { 
     UnregisterHotKey(hWnds, 1); 
     UnregisterHotKey(hWnds, 2); 
    } 

    #region WindowsAPI 
    [DllImport("user32.dll")] 
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); 

    [DllImport("user32.dll")] 
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id); 
    #endregion 
} 

メインフォームコード:(以下のコードは、ホットキーに関連するだけのコードである)あなたのような

private void Form1_Load(object sender, EventArgs e) 
    { 
     thisWindow = FindWindow(null, "Form1"); 
     _hotKeys = new HotKeys(thisWindow); 
     _hotKeys.RegisterHotKeys(); 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     _hotKeys.UnregisterHotKeys(); 
    } 

protected override void WndProc(ref Message keyPressed) 
    { 
     if (keyPressed.Msg == 0x0312) 
     { 
      MessageBox.Show("my msg"); 
      //keyPress = keyPressed.WParam; 
      //if (keyPress == (IntPtr)1) 
      //{ 
      // if (!autoSkillIsOn) 
      // { 
      //  timer1.Start(); 
      //  autoSkillIsOn = true; 
      // } 

      // else if (autoSkillIsOn) 
      // { 
      //  timer1.Stop(); 
      //  autoSkillIsOn = false; 
      // } 
      //} 

      //else if (keyPress == (IntPtr)2) 
      //{ 
      // MessageBox.Show("pressed ctrl R"); 
      //} 
     } 

     base.WndProc(ref keyPressed); 
    } 

WndProcで見ることができます私は起こりたいものをコメントアウトし、単純なメッセージボックスを書くだけですが、登録されたホットキー(Ctrl + T、Ctrl + R)のどれを押してもメッセージボックスは表示されません。なぜこれが起こるのですか?コードがちょうどホットキーに関するすべてであるのは初めてのことです。助けを進んでいただきありがとうございます!

+0

少し動いてからアプリケーションを実行した後に動作を停止しますか?過去に、キー押しからイベントをトリガーするハンドラーへの参照を失った問題がありましたか?ロングショットですが、ハンドラへの参照をアクティブに保つことに関して同様の問題になる可能性がありますか? –

+0

ちょっとしたことはありません。私はそれを実行すると、登録されたキーを押して何も起こらない。 –

+0

@Joe_DMちょっと私は新しいWinFormを作成しようとしましたが、グローバルホットキーのコードを書いてみました。あなたはそれをどのように修正することができますか? –

答えて

0

コメントで、トラブルシューティング中に解決されているようだので、私は答えを投稿します。

オペアンプは、しかし、これはおそらく間違ったハンドルを見つけた、ハンドルへの参照を取得するためにFindWindow(null, "Form1")を使用しています。 (From1のメモリに複数のインスタンスがある可能性があります)

this.Handleを使用するように変更すると、電話をかけているインスタンスの正しいハンドルにホットキーを登録することが保証されます。

関連する問題