none
C# Mouse按鍵事件問題 RRS feed

  • 一般討論

  • C#中有提供Mouse滑鼠按鍵事件(MouseDown/MouseUp).

    小弟弄了一個簡單的錄製滑鼠鍵盤的小程式.

    在下面的動作下MouseDown事件不會被產生.

    造成錄製出來的動作是錯誤的.

    按下滑鼠左鍵(不放開)->按下滑鼠右鍵->放開滑鼠右鍵

    這時候跑出來的Mouse事件會只有第一次的mousedown還有按下滑鼠右鍵時產生的mouseup.

    透過收視窗訊息的的方法,可以收到滑鼠按鍵訊息,另外透過讀取按鍵狀態來做判斷

    但滑鼠左鍵放開這個事件,在視窗訊息中似乎不會產生訊息碼.

    請教是否有其他方法可以在"按下滑鼠左鍵(不放開)->按下滑鼠右鍵->放開滑鼠右鍵"操作模式下正確得到滑鼠的按鍵狀態?

    2011年7月26日 下午 02:33

所有回覆

  • 您好 shusheng,

    請問您這個程式是為了完成什麼功能呢?依照小弟的經驗,正常的滑鼠操作並不會用到這樣的手法或是技巧唷~~~



    Best regards
    • 已編輯 DK. Da 2012年6月10日 上午 12:47
    2011年7月26日 下午 03:34
  • 小弟沒有實作過右鍵,但印象中mouseup應該是指你放開滑鼠的動作吧!?

    試試 OnMouseRightButtonDown 跟 OnMouseRightButtonUP 看看


    coding or not
    2011年7月26日 下午 03:42
  • Hi:

    因為您沒提供是在哪個控制項做滑鼠按下放開動作,所以以下以Form1搭配label1控制項為例:

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Left)
          {
            label1.Text += "按下滑鼠左鍵\n";//Debug用 
          
          }
    
          if (e.Button==MouseButtons.Right)
          {
            label1.Text += "按下滑鼠右鍵\n";//Debug用 
          }
        }
    
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
          if (e.Button == MouseButtons.Left)
          {
            label1.Text += "放開滑鼠左鍵\n";//Debug用 
    
          }
    
          if (e.Button == MouseButtons.Right)
          {
            label1.Text += "放開滑鼠右鍵\n";//Debug用 
          }
        }
    
    

     


    Shadowと愉快なコード達
    Please correct me if my concept is wrong
    2011年7月26日 下午 03:48
  • 您好

    請看一下以下範例

    Processing Global Mouse and Keyboard Hooks in C#

    http://www.codeproject.com/KB/cs/globalhook.aspx

    Global Mouse and Keyboard Library

    http://www.codeproject.com/KB/system/globalmousekeyboardlib.aspx

    Global System Hooks in .NET

    http://www.codeproject.com/KB/system/globalsystemhook.aspx


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年7月26日 下午 03:56
    版主
  • 就是錄製滑鼠鍵盤的操作順序.

    拿來當作後續的模擬按鍵用的.

    這麼做只是讓程式在錄製時操作更方便.

    2011年7月26日 下午 04:43
  • 我是在listview控制項上做的.

    我的問題會在於當我滑鼠左鍵沒有放開.

    而按下滑鼠右鍵時.在listview控制項中會產生MouseUp事件.

    造成錄不出來RightDown按鍵.

    放開後也無法產生MouseUp事件.

    所以所產生的事件變成只有兩個

    1.LeftDown (按下左鍵未放開)

    2.RightUp (按下右鍵就產生)

    2011年7月26日 下午 04:49
  • 感謝你提供的資料.

    我會試試看.

    2011年7月26日 下午 04:54
  • 我是在listview控制項上做的.

    我的問題會在於當我滑鼠左鍵沒有放開.

    而按下滑鼠右鍵時.在listview控制項中會產生MouseUp事件.

    造成錄不出來RightDown按鍵.

    放開後也無法產生MouseUp事件.

    所以所產生的事件變成只有兩個

    1.LeftDown (按下左鍵未放開)

    2.RightUp (按下右鍵就產生)


    剛剛用ListView控制項玩了一下

     

     private void listView1_MouseDown(object sender, MouseEventArgs e)
        {
          
          if (e.Button == MouseButtons.Left)
          {
            label1.Text += "按下滑鼠左鍵\n";//Debug用 
          }
    
          if (e.Button == MouseButtons.Right)
          {
            label1.Text += "按下滑鼠右鍵\n";//Debug用 
          }
    
        }
    
        private void listView1_MouseUp(object sender, MouseEventArgs e)
        {
         
           if (e.Button == MouseButtons.Left)
          {
            label1.Text += "放開滑鼠左鍵\n";//Debug用 
    
          }
    
    
    
          if (e.Button == MouseButtons.Right)
          {
            label1.Text += "放開滑鼠右鍵\n";//Debug用 
          }
    
        }
    


    真的是奇怪

    邏輯和剛剛的Form1一樣,Form1沒有此問題,但是ListView卻有您說的問題,看來此主題我要好好關注一下@@
    Shadowと愉快なコード達
    Please correct me if my concept is wrong
    2011年7月26日 下午 05:19
  • 目前先利用自訂控制項複寫Wndproc後.

    利用SendMessage自定義訊息.並做出Mouse紀錄動作.

     

    先前在Form內直接看滑鼠的msg事件看不出數值.

    要debug中斷看msg變量才看得到

    2011年7月28日 下午 04:12