none
請問一個簡單的滑鼠連擊程式 RRS feed

  • 問題

  • 最近想寫一個簡單的滑鼠連擊程式,相關程式碼如下

    主要是建立二個button控制項,一個為"連擊開始"(button1),一個為"連擊結束"(button2)

    不過在滑鼠點選button1的控制項後,接著button2的控制項也被指向false,無法再進行點選

    於是程式就陷入無窮迴圈了...

    想請問是我哪裡的語法有問題呢?

    謝謝

    private void button1_MouseClick(object sender, MouseEventArgs e)
             {
                 button1.Enabled = false;
                 if (e.Button == MouseButtons.Left)
                 {
                     while (button1.Enabled==false)
                     {
                         button1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.button1_MouseClick);
                         GC.Collect();
                         if (button2.Enabled == false)
                         {
                             return;
                         }
                     }       
                 }
             }
             private void button2_MouseClick(object sender, MouseEventArgs e)
             {
                 button2.Enabled = false;
             }

    2016年5月11日 下午 03:31

解答

  • 您好,

    button預設的 ControlStyles.StandardClick and ControlStyles.StandardDoubleClick  都是 false,

    所以不會引發 DoubleClick 事件,

    詳細您可以參考: Button.DoubleClick Event

    如果您要讓 button 有 DoubleClick 事件處理能力的話,

    可以參考: WinForms how to call a Double-Click Event on a Button?

    或是用 reflect 的方式去 Call  button的SetStyle Method,如下,

    MethodInfo m = typeof(Button).GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
    if (m != null)
    {
    	m.Invoke(button1, new object[] { ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true });
    }
    button1.DoubleClick += (s, arg) => {
    	MessageBox.Show("You are in the Button.DoubleClick event.");
    };

    就可以了。


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2016年5月13日 上午 01:18 add reflection way
    • 已標示為解答 filling71 2016年5月17日 下午 03:37
    2016年5月13日 上午 01:03

所有回覆

  • 您好,

    button1_MouseClick 中沒看到有設定 button2.Enabled 的屬性!

    只是 button1_MouseClick 一開始就將  button1.Enabled = false;

    而在 while 中又沒有設定  button1.Enabled = true ,

    所以自然是出不了迴圈.....

    而且 button1.MouseClick 不需要一直加新的事件訂閱 Method

    button1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.button1_MouseClick);

    不知您在 button1_MouseClick 用 while 的用意是什麼呢?

    如果只是2個button的enabled 屬性的切換,可在click event 中去設定 button1 & button2 的 enabled 屬性。

    private void button1_MouseClick(object sender, MouseEventArgs e)
    {
    	button1.Enabled = false;
    	button2.Enabled = true;
    	if (e.Button == MouseButtons.Left)
    	{
    		while (button1.Enabled == false)
    		{
    			Application.DoEvents();
    			if (button2.Enabled == false)
    			{
    				button1.Enabled = true;
    				return;
    			}
    		}
    	}
    }
    
    private void button2_MouseClick(object sender, MouseEventArgs e)
    {
    	button2.Enabled = false;
    }

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/




    2016年5月12日 上午 12:55
  • 你好,謝謝你的回覆

    這個程式主要的目的是當button1被點擊之後,可以產生滑鼠連續點擊的效果

    所以才會在button1_MouseClick 用 while 的迴圈

    不知道若使用您提供的方法是否可以產生一樣的效果呢?

    2016年5月12日 下午 02:16
  • 如果你要呼叫 Button1 的 Double Click ,直接呼叫,Button1 的屬性不管如何變化,不會產生 Click 事件。

    自己程式都是直接呼叫,對其他程式用 mouseevent 模擬。可以看看這篇:http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=32


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年5月12日 下午 03:05
  • 您好,

    button預設的 ControlStyles.StandardClick and ControlStyles.StandardDoubleClick  都是 false,

    所以不會引發 DoubleClick 事件,

    詳細您可以參考: Button.DoubleClick Event

    如果您要讓 button 有 DoubleClick 事件處理能力的話,

    可以參考: WinForms how to call a Double-Click Event on a Button?

    或是用 reflect 的方式去 Call  button的SetStyle Method,如下,

    MethodInfo m = typeof(Button).GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
    if (m != null)
    {
    	m.Invoke(button1, new object[] { ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true });
    }
    button1.DoubleClick += (s, arg) => {
    	MessageBox.Show("You are in the Button.DoubleClick event.");
    };

    就可以了。


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2016年5月13日 上午 01:18 add reflection way
    • 已標示為解答 filling71 2016年5月17日 下午 03:37
    2016年5月13日 上午 01:03