2011-10-25 2 views
2

Windows XP Embedded上で実行されているタッチスクリーンアプリケーションで作業しています。ユーザーが数秒間押し続けると、コンテキストメニューが表示されます。しかし、これはスクロールバーのようなコントロールを押さえつけることを妨げ、ユーザーがスクロールして最後までスクロールしないようにします。しかし、アプリケーション全体の右クリック機能を無効にしたくありません。私はスクロールバーのようなコントロールをこのアクションから除外したいだけです。ユーザーがタッチスクリーン上のスクロールバーの下向きの矢印を押下するとWindows XP EmbeddedでコントロールごとにC#Winformsアプリケーションを右クリック(押したままにする)を無効にします

は、ログには示しています

----Application Starts---- 
OnMouseDown: Left, Capture = true 
[A few seconds later in the log, even though the user is still holding down...] 
OnMouseUp: Left, Capture = false 
OnMouseCaptureChanged, Capture = false 
OnMouseDown: Right 
OnMouseDown: Middle 
OnMouseCaptureChanged, Capture = false 
OnMouseCaptureChanged, Capture = false 
OnMouseUp: Right 
OnMouseUp: Middle 
----Application Ends---- 

私はPreFilterMessageを使用してイベントを上下右と中央のマウスをフィルタリングし、しようとしました。カスタムスクロールバーコントロールのctorで、私は次を追加しました:Application.AddMessageFilter(this); PreFilterMessageの後ろに:

public bool PreFilterMessage(ref Message m) 
{ 
    switch (m.Msg) 
    { 
     case (int)WindowsMessages.WM_RBUTTONDOWN: 
     case (int)WindowsMessages.WM_RBUTTONUP: 
     case (int)WindowsMessages.WM_MBUTTONDOWN: 
      return true; 
     case (int)WindowsMessages.WM_MBUTTONUP: 
      System.Diagnostics.Debug.WriteLine("**** Context-menu interruption."); 
      return true; 
    } 

    return false; 
} 

これは引き続きユーザーの操作を中断します。

WM_MBUTTONUPのケースでOnMouseDownをプッシュしようとしましたが、自分のマウスダウンイベントがイベントキューに存在しないため、ユーザーが画面を放した後にスクロールバーがスクロールし続けますそれを止めるためのマウスはありません。

this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, 
            MousePosition.X, MousePosition.Y, 0)); 

代わりに左下を実行するためにSendInputを使用しようとしました。しかし、前と同じ問題が発生しました。

INPUT mouseDownInput = new INPUT(); 
mouseDownInput.type = SendInputEventType.InputMouse; 
mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN; 
SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT())); 

私はポストメッセージでこれを解決しようとしましたが、これは役に立ちませんでした。

PostMessage(this.Handle, (int)WindowsMessages.WM_LBUTTONDOWN, 
      (int)VirtualKeys.MK_LBUTTON, 
      (uint)((MousePosition.Y << 16) | MousePosition.X)); 

私は効果なしで、CTORにも以下のことを試してみました:

this.ContextMenu = new ContextMenu(); 

を私も私完全に無効になり、右ミドルクリックし、コンテキストメニューの効果はまだ左を引き起こしたマウスフックを試みましたマウスを押し上げると、ユーザーの操作が停止しました。

基本的に、これから回復する方法がないようで、私はこれに対処するためにstackoverflowで何の答えも見つけられませんでした。しかし、WinFormsに存在しないコントロールのOnPreviewMouseRightButtonDownとOnPreviewMouseRightButtonUpをオーバーライドする答えがstackoverflowのWPFに関する同様の質問がありました。

ヘルプ!

答えて

0

あなたの場合私はどのようにこの結果を達成することができます考えがあります。

ポップアップメニューを表示し、フォームにタイムコントロールを追加する方法を作成する必要があります。

OnMouseDownイベントは、タイマーコントロールとハンドタイマーのティックイベントを開始し、変数に開始時刻を格納し、すべてのティックでチェックします。ユーザーが3秒間押したければ、このようにチェックする必要があります「のStartTime」という名前の開始時刻の変数があります。経過時間が時間であれば

if((DateTime.Now - StartTime).Seconds >= 3) 

が3秒を超えているが、あなたはタイマーを停止する必要がありますポップアップメニュー

今onMouseUpのイベントを示しています。

関連する問題