none
如何於WindowsFrom欄截Win32 Message CM_MOUSEENTER . RRS feed

  • 問題

  •  我想欄截 CM_MOUSEENTER與     CM_MOUSELEAVE  於  C# WindowsForm   當滑鼠離開整個From 時,於進入Form ,處理一些事,
    目前C# 無法取得 此兩視窗訊息


    於Win32 AP Code For delphi 是可以運作的

    Delphi Code


    const
      CM_BASE                   = $B000;
      CM_MOUSEENTER             = CM_BASE + 19;
      CM_MOUSELEAVE             = CM_BASE + 20;

        procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;

    procedure TForm1.CMMouseEnter(var msg: TMessage);
    begin
    //got it.
    end;
    procedure TForm1.CMMouseLeave(var msg: TMessage);
    begin
    //got it.
    end;



    C# Code

    public partial class MyForm : Form
    {
    ....

    class Win32
            {
                const int CM_BASE = 0xB000;
                public const int CM_MOUSEENTER = CM_BASE+19;
                public const int CM_MOUSELEAVE = CM_BASE + 20;

            }

            protected override void WndProc(ref Message m)
            {
                System.Diagnostics.Debug.WriteLine(m.Msg);
                switch (m.Msg)
                {
                       
                    case Win32.CM_MOUSEENTER: System.Diagnostics.Debug.WriteLine("CM_MOUSEENTER"); break;
                    case Win32.CM_MOUSELEAVE: System.Diagnostics.Debug.WriteLine("CM_MOUSELEAVE"); break;
                }

                base.WndProc(ref m);
            }

    ....







    2009年2月12日 下午 05:12

解答

  •  於Win32 AP Code For delphi 是可以運作的

    Delphi Code


    const
      CM_BASE                   = $B000;
      CM_MOUSEENTER             = CM_BASE + 19;
      CM_MOUSELEAVE             = CM_BASE + 20;

        procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;


    剛看過  win32 API   無  CM_MOUSEENTER  Define  這應該是  Delphi VCL Control 自訂的

    於C# 中要實現上述功能
    我的解法使用Thread Method 去偵測Cursor.Position

     
     
    bool  _continue=true;
     ....
     
            void CheckWindowsPostion()  
            {  
                while (_continue)  
                {  
                    Point point = Cursor.Position;  
                    bool inArea =  
                        (  
                        (this.Left <= point.X) && ((this.Left + this.panel2.Width) > point.X)  
                        )  
                        &&  
                        (  
                        (this.Top <= point.Y) && ((this.Top + this.panel2.Height) > point.Y)  
                       );  
     
                    if (inArea)  
                    {  
                        //do something  SET UI Form Postion  
                    }  
                    else  
                    {  
     
                        //do something SET UI Form Postion  
     
                    }  
     
     
                    Thread.Sleep(10);  
                }  
            } 
    • 已標示為解答 Lolota Lee 2009年2月23日 上午 02:24
    2009年2月13日 上午 09:30

所有回覆

  • 你好:
    於From 置入此Code 是可以收到MouseEnter 與 MouseLeave EVENT
            private void Form1_MouseEnter(object sender, EventArgs e)  
            {  
                System.Diagnostics.Debug.WriteLine("CM_MOUSEENTER");  
            }  
     
            private void Form1_MouseLeave(object sender, EventArgs e)  
            {  
                System.Diagnostics.Debug.WriteLine("CM_MOUSELEAVE");  
            }  
     
    但我置入 Panel  Dock Fill 時就收不到 EVENT

    .

    如我POST  Win32 Code 確是可以收到的,
    這兩個是有差別的.

    如From 1上有 5個 Panel 做版面Layout 設計 

    Pannel1  dock top
    Pannel2  dock top
    Pannel3  dock top
    Pannel4  dock top
    Pannel5  dock Fill


    每個Pannel 都寫MouseEnter與MouseLeave.似乎有解.
    但Code會變的很複雜
    2009年2月13日 上午 02:06
  •  於Win32 AP Code For delphi 是可以運作的

    Delphi Code


    const
      CM_BASE                   = $B000;
      CM_MOUSEENTER             = CM_BASE + 19;
      CM_MOUSELEAVE             = CM_BASE + 20;

        procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;


    剛看過  win32 API   無  CM_MOUSEENTER  Define  這應該是  Delphi VCL Control 自訂的

    於C# 中要實現上述功能
    我的解法使用Thread Method 去偵測Cursor.Position

     
     
    bool  _continue=true;
     ....
     
            void CheckWindowsPostion()  
            {  
                while (_continue)  
                {  
                    Point point = Cursor.Position;  
                    bool inArea =  
                        (  
                        (this.Left <= point.X) && ((this.Left + this.panel2.Width) > point.X)  
                        )  
                        &&  
                        (  
                        (this.Top <= point.Y) && ((this.Top + this.panel2.Height) > point.Y)  
                       );  
     
                    if (inArea)  
                    {  
                        //do something  SET UI Form Postion  
                    }  
                    else  
                    {  
     
                        //do something SET UI Form Postion  
     
                    }  
     
     
                    Thread.Sleep(10);  
                }  
            } 
    • 已標示為解答 Lolota Lee 2009年2月23日 上午 02:24
    2009年2月13日 上午 09:30