3

クリックを検出して、クリックが実際に発生した後にのみ関数を呼び出すプリフォームを検出しようとしています。

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m) {
    //Detect a Click
    if (m.Msg == 0x210 && m.WParam.ToInt32() == 513){
        lastClick = DateTime.Now;
        clickedHappened();
        Debug.Print("Click Detected!");
    }

    base.WndProc(ref m);

}

private void clickedHappened(){
    MessageBox.Show("Click Already Happened");
}

実際のクリックが行われる前にWndProcが発生すると思います。タイマー
を使わずにこれを解決する方法があるかどうか疑問に思っていましたか? または;sleep(400)

私が思いつく唯一の解決策は timer を使用することですが、既存のタイマーのいくつかを取り除きたいです。WndProcで検出されてから 200 ~ 350 ミリ秒後にクリックが実際に発生するようです。

4

2 に答える 2

4

WndProc は Window Procedure の略で、ウィンドウ、描画、マウス キャプチャ、キーボード キャプチャ、サイズ変更などのすべてを処理するプロシージャです。

さまざまな結果のためにマウスをキャプチャする方法もいくつかあります

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
         case 0x201:
           //left button down
           break;
          case 0x202:
           clickedHappened(); //left button up, ie. a click
           break;
         case 0x203:
           //left button double click
           break;
    }

    base.WndProc(ref m);
}

問題は、C# の Windows フォームが既にこれらすべてを処理しており、WndProc からイベントを発生させることです。この種のことのために WndProc を自分で処理する必要はありません。

マウス通知メッセージの完全なリストについては、MSDN: マウス入力通知を参照してください。すべての wndproc メッセージのリストについては、MSDN システム定義メッセージを参照してください。

于 2013-07-12T08:06:25.513 に答える