none
滑鼠在標題列按壓右鍵不放,程式會停止 RRS feed

  • 問題

  • 各位好,我目前有遇到問題是在表單裡面有用timer隨時在更新時間

    但是當滑鼠移到標題列,按壓著滑鼠右鍵不放,

    會造成整個程式都停止不動,放開之後又繼續會執行

    按壓著不放左鍵也會停止,但停時間比較短之後就會繼續執行,這是在沒有放開左鍵的狀況下(像lag的感覺)

    想請問一下有沒有什麼方式可以避免讓滑鼠按標題列時不要有此現象發生

    2011年12月20日 上午 10:42

解答

  • 您好,我測試了一下,發現在TitleBar按下去的訊息號碼是164,所以我在 WndProc method中攔截,如果是164就不處理,如下的Code,請試試看,謝謝!

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            protected override void WndProc(ref Message m)
            {
                if ((int)m.Msg == 164)
                {
    				//發現是164就直接不處理它
                    return;
                }
                base.WndProc(ref m);
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
        }
    }
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已標示為解答 vic kuo 2011年12月22日 上午 04:34
    2011年12月21日 上午 09:47

所有回覆

  • 加上 Application.Doevents() 試試
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月20日 上午 11:11
    版主
  • 會不會是因為 Window Message 被暫時阻斷?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年12月20日 下午 12:58
  • 有在Form1_MouseDown事件裡面加上Application.DoEvents() ,沒有作用。 按右鍵還是會停住,不知道我有沒有寫錯地方

    "windos message被暫時阻斷" , 關於這點我無法了解你所說的意思, 可以再進一步的跟我說明一下嗎?

    • 已編輯 vic kuo 2011年12月21日 上午 12:56
    2011年12月21日 上午 12:52
  • 您好

    在您有更新表單的地方,加上 Application.DoEvents(),例如 Timer_Tick

    http://www.blueshop.com.tw/board/show.asp?subcde=BRD201112201835510ZC


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年12月21日 上午 01:14
  • 覺得像心冷大說的,因為您按下右鍵時,他是要出現ContextMenu,所以您UI透過timer去顯示日期時間就不會運作了!

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已編輯 亂馬客 2011年12月21日 上午 01:32
    2011年12月21日 上午 01:31
  • TO 小歐ou

    我在藍色小舖也有發同樣的問題,剛剛我也有嚐試將application.doevents 加到 timer_tick裡面

    但是狀況還是一樣出現。

    TO 亂馬客

    我也是有想過這種可能性,我有去調整form屬性裡面的controlbox=false

    這樣做contextmenu是不會被顯示,但同樣的狀況還是有

    我做了一些實驗我將FormBorderStyle改成沒有標題列的"NONE"之後,因為沒有標題列可按就不會觸發此現象。

    想請教一下有沒有哪種方法可以在保留標題列的狀況下,能夠解決掉這個問題

     

     

    2011年12月21日 上午 04:44
  • 您好,我測試了一下,發現在TitleBar按下去的訊息號碼是164,所以我在 WndProc method中攔截,如果是164就不處理,如下的Code,請試試看,謝謝!

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            protected override void WndProc(ref Message m)
            {
                if ((int)m.Msg == 164)
                {
    				//發現是164就直接不處理它
                    return;
                }
                base.WndProc(ref m);
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
        }
    }
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已標示為解答 vic kuo 2011年12月22日 上午 04:34
    2011年12月21日 上午 09:47
  • To 亂馬客

    我按照你的方法改也有成功

    不過我還想請教一下當按左鍵的訊息號碼該怎麼查?

    我希望左右鍵按titlebar下去的時候都不要有作用

    我的觀察方式是直接把他write出來

    Protected Overrides sub WndProc(ByRef m As System.Windows.Forms.Message)

    Debug.WriteLine(m.Msg)

    End Sub

    但這樣我無法觀察,因為有很多其他的訊息號碼

    可以順便指導我一下該用哪種方式來觀察這接訊息代碼

     

    2011年12月21日 上午 10:11
  • Msg的值為0xA1,不過,你去卡左鍵的話,那user如果要移動視窗就不能移動,也無法關閉視窗哦!

     

    if ((int)m.Msg == 164 || (int)m.Msg == 0xA1)

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年12月21日 上午 10:24
  • TO亂馬客

    user不移動視窗沒有關係,而且我有另做一個關閉的按鈕給他們用,所以這點還能接受

    不過我還有個問題   msg值為0xA1在vb.net裡面要怎麼轉換?

    我觀察整個msg裡面都只有數字沒有出現0xA1這種字串,我有把他轉成ASC碼,試了之後沒有做用

     

     

    2011年12月22日 上午 01:17
  • 那是16進位的值啦! 在VB是&Ha1

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年12月22日 上午 03:58
  • 抱歉抱歉~我學藝不精!  問題已經解決了,感謝各位的協助!

    2011年12月22日 上午 04:34
  • 如果不要window的titlebar可以用mouse操作,另一個方式是不要顯示titlebar,然後自已在最上面放個panel (dock設為top)做為titlebar也可以!
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年12月22日 上午 04:40