none
MouseDown > ButtonClick 計算滑鼠(全域)點擊次數 RRS feed

  • 問題

  • 請教大家
    小弟要寫一個可以計算滑鼠點擊次數(全域_windows)的程式,
    目前全域的部份已經ok,可以計算使用windows時,mouse點的次數

    但是我現在想要再寫"加" & "減"的button,
    means可以讓使用者自已微調現在count的次數的值
    如下圖
    http://img296.imageshack.us/img296/4149/tmp1560iz5.jpg

    如果在不是按(+) & (-)這2個button,指是點其他的地方,count 的值就是1(mouseClick)
    反之則按加+的button(值一樣加1),減的button(值-1)
    但是現在的問題時…
    c#裡面順序
    MouseDown > ButtonClick
    所以我如果在+的button上按下去,會先跑MouseDown再去run buttonClick

    means

    MouseDown先發生,就去setCountLabel的值,

    之後等mouseDown跑完, 才換ButtonClick -->bAdd_click{ blAdd=true}是這邊才設成true

    也就是說當在+的button按第1下時,先run mousedown,但是這時的blDelete還是false,

    要等mouseDown完,才會去run ButtonClick的function -->bDelete_click(),此時才會把blDelete設true

    所以都會多加 or 多減一次…

     

    情境:

    1. 一開始run,按按按按按( 非加減的button),gCount=4

    2. 去按了一次 "減" 的button ,但是gCount 還是加1 gCount=5

    3. 再按了一次"減" 的button,才開始-1 gCount=4

    反之按 "加"的button也是一樣

     

    原因:

     

    在上面2. 按了減的button時,是先run mouseDown,而不是先去把blDelete設為true

    c#跑的流程為 1. MouseDown(blDelete=false)<---這裡應該就要加1了

                        2. ButtonClick(blDelete=true)<--這邊才會設成true,才會加1

     

    請問各位先進該如果解決這個問題呢??

    感謝。

     

     

     

        public partial class HookTestForm : Form
        {

            /# set global variable#/

            int gCount = 0; //點擊次數的值

            Boolean blNonButton = true; //非button,一開始不會按button,所以是true, false when button click

            Boolean blDelete = false; //是否按下 "-" button
            Boolean blAdd = false;//是否按下 "+" button

     

     

    Code of MouseDown

            void mouseHook_MouseDown(object sender, MouseEventArgs e)
            {

                AddMouseEvent("MouseDown",e.Button.ToString(),
                                e.X.ToString(),e.Y.ToString(),
                                e.Clicks.ToString());
                    SetCountLabel();//設定CountLabel 的值
       }

     

     

           

    Code of Add & Subtract

    private void bAdd_Click(object sender, EventArgs e)
            {
                
                blAdd = true;
                blNonButton = flase;
              
            }

           


    private void bDelete_Click(object sender, EventArgs e)
            {
                blDelete = true;
                blNonButton = false;

            }

     

     

    Code the value of SetCountLabel

    void SetCountLabel()
            {

                try
                {

               
                    if (blDelete && !blAdd && !blNonButton)
                    {
                        gCount = gCount-1;
                        blDelete = false;
                        blNonButton = true;
                        countLabel.Text = String.Format("Count={0}", gCount);
                    }
                    else if (blAdd && !blDelete && !blNonButton)
                    {
                        gCount = gCount+1;
                        blAdd = false;
                        blNonButton = true;
                        countLabel.Text = String.Format("Count={0}", gCount);
                    }
                    else if (!blAdd && !blDelete && blNonButton)
                    {
                        gCount = gCount+1;
                        blNonButton = true;
                        countLabel.Text = String.Format("Count={0}", gCount);
                    }

     

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.StackTrace);
                }
            }

     

     

     

     

    2008年12月18日 上午 08:03

解答

  • Code Snippet

    private void bDelete_Click(object sender, EventArgs e)
    {
     if(!blDelete)
      gCount = gCount-2;

     blDelete = true;
     blNonButton = false;
    }

     

     

    多加的就減回來就好啦,既然在第一次按鈕時會判斷錯誤

    那就用blDelete來判斷是不是第一次按鈕,來把資料釐正...

    2008年12月20日 下午 05:03

所有回覆

  • 你無法更改windows觸發事件的順序,所以只能用偷吃步了...

    自己把資料釐正

     

    Code Snippet

    private void bAdd_Click(object sender, EventArgs e)
    {           
     if(!blAdd)
      gCount = gCount+1;

     blAdd = true;
     blNonButton = flase;
             
    }

           


    private void bDelete_Click(object sender, EventArgs e)
    {
     if(!blDelete)
      gCount = gCount-1;

     blDelete = true;
     blNonButton = false;
    }

     

     

    2008年12月18日 上午 10:10
  • Dear Zion
    謝謝您的回答
    不過照您的方式

     if(!blAdd)
      gCount = gCount+1;


     if(!blDelete)
      gCount = gCount-1;


    這樣子是
    第一次按加時,Count會加1,
    再按第2次時,就會每次加2

    按減也是…

    請問您還有別的方法嗎?
    2008年12月19日 上午 02:01
  •  

    所以才會有先檢查blAdd跟blDelete值的if 啊 ^^"

    如果我沒誤解你的需求的話,這樣按第2次並不會加2

    2008年12月19日 上午 07:06
  • Dear Zion
    謝謝您的回答
    因為 blAdd & blDelete的初值皆為false
    所以 if(!blAdd)
                    gCount++
    會在這邊加一次,然後 mouseHook_MouseDown那邊又加一次,所以就都會加2
    所以改成 if(blAdd) gCount++ ,這樣子就一次都加1了,但是這樣子問題還是一樣
    就是
    ex: 第1次按加鈕,連按了3次 (1,1,1==>count=3)
          第4次,按減鈕,還是再加一次(count=4)-->理論上應該要-1
          第5次,按減鈕,才減1 (count=3)

    這是因為按加鈕後,blAdd=true,之後按減鈕時,blDelete還沒被設為true因為會先run

    if (blDelete && !blAdd && !blNonButton) //subtract -->進不來,blDelete還是false(初值)

    else if (blAdd && !blDelete && !blNonButton) //add
    -->進來了
    所以會先加1(after mouse click),才會去buttonClick才會將blDelete設true
    所以第2次的才會開始減…

    還是老問題, MouseClick > ButtonClick,thus Button Click的值第一次被按時,無法被取得。

    還請您指教。
    謝謝

    點mouseclick後-->setCountLabel

    if (blDelete && !blAdd && !blNonButton) //subtract
    {
    gCount = gCount-1;
    blDelete = false;

    blNonButton = true;
    countLabel.Text = String.Format("Count={0}", gCount);
    }
    else if (blAdd && !blDelete && !blNonButton) //add
    {
    gCount = gCount+1;
    blAdd = false;

    blNonButton = true;
    countLabel.Text = String.Format("Count={0}", gCount);
    }
    else if (!blAdd && !blDelete && blNonButton) //otherwise add
    {
    gCount = gCount+1;
    blNonButton = true;
    countLabel.Text = String.Format("Count={0}", gCount);
    }


                  


    2008年12月19日 上午 08:43
  • Code Snippet

    private void bDelete_Click(object sender, EventArgs e)
    {
     if(!blDelete)
      gCount = gCount-2;

     blDelete = true;
     blNonButton = false;
    }

     

     

    多加的就減回來就好啦,既然在第一次按鈕時會判斷錯誤

    那就用blDelete來判斷是不是第一次按鈕,來把資料釐正...

    2008年12月20日 下午 05:03
  • Dear Zion
    謝謝你耐心的回應…
    我想我的問題在於,如果在按下 + button or -button時,就將blAdd or blDelete 設為true
    在非按鈕區(視窗其他地方)按鍵時,都是+1

    當我按下click(不管是按鈕 or 其他地方)時,就會去設定顯示的值,


    void mouseHook_MouseDown(object sender, MouseEventArgs e)  

            {

                AddMouseEvent("MouseDown",e.Button.ToString(),

                                e.X.ToString(),e.Y.ToString(), e.Clicks.ToString());

                   SetCountLabel();//設定CountLabel 的值

            }


    所以如何判斷這個click是button or 其他地方就是個問題…
    現在是把blAdd(是否有按)這個判斷放在

            private void bAdd_Click(object sender, EventArgs e)
            {
                if (blAdd)
                    gCount++;
                //countLabel.Text = String.Format("Count={0}", gCount);
                blAdd = true;
                blNonButton = false;
               // return blAdd;
            }
    但是 void bAdd_Click這個function是等Mouse_Down執行時,才會執行…
    所以當我第一次按下 button時,還沒有辦法判斷是+ or - mous_down就執行,並判斷為
    不是button,所以+1(因為blAdd & blDelete初值為false)

                    else if (!blAdd && !blDelete && blNonButton){ //otherwise add{           
                        gCount = gCount+1;
                        blNonButton = true;
                        countLabel.Text = String.Format("Count={0}", gCount);
                    }

    如果您方便的話,可以把code上傳給您執行看看嗎?
    謝謝您
    2008年12月22日 上午 02:53
  • 我是真的不知道你的問題在哪了...總覺得你把事情想的太複雜

     

    >> 所以如何判斷這個click是button or 其他地方就是個問題…

    click在button上會多觸發button click事件,怎麼會有問題呢?

    再者blAdd 初值應為true,因為一開始就已經點一下就加一了

     

    建議您畫個流程圖,這邏輯沒這麼複雜的

     

    2008年12月22日 上午 06:22