2011-06-26 144 views
1

我有一个WinForm,现在我需要在窗口标题部分更改光标。我有一些代码的工作,它有2个问题:在窗口标题中更改光标

  1. 它也改变了,当光标在边缘上(正常大小调整光标应该显示)。 我发现我需要这样的东西 WM_NCHITTEST & HTTOP,但我该如何结合呢?
  2. 移动鼠标时有一些闪烁。

我也试过把代码放在base.WndProc(ref m);下面。

这是我已经有了代码:

if ((m.Msg == Win32.WM.NCMOUSEMOVE 
    || m.Msg == Win32.WM.NCLBUTTONDOWN || m.Msg == Win32.WM.NCLBUTTONUP 
    || m.Msg == Win32.WM.NCRBUTTONDOWN || m.Msg == Win32.WM.NCRBUTTONUP) 
) 
{ 
    if (m.WParam.ToInt32() != Win32.HT.TOP && m.WParam.ToInt32() != Win32.HT.RIGHT && m.WParam.ToInt32() != Win32.HT.BOTTOM && m.WParam.ToInt32() != Win32.HT.LEFT) 
    { 
     Cursor = Cursors.Hand; 
    } 
} 

编辑:
我不是间谍登录正确的消息++。找到窗口边缘的解决方案(参见更新后的代码)。

Thnx,J

+0

如何伪造窗口标题部分?只是一个想法。 – NinethSense

+0

我已将窗口标题部分延伸至波纹管,以允许玻璃透明度。最重要的是,我绘制了一些东西,但我无法弄清楚如何在整个标题上正确更改鼠标光标。 – jerone

回答

5

它会因为使用错误的信息而闪烁。任何鼠标移动后面跟着WM_SETCURSOR以允许应用程序更改光标。所以光标变回默认值。改为拦截WM_SETCURSOR。 LParam的低位字包含命中测试代码。

protected override void WndProc(ref Message m) { 
     if (m.Msg == 0x20) { // Trap WM_SETCUROR 
      if ((m.LParam.ToInt32() & 0xffff) == 2) { // Trap HTCAPTION 
       Cursor.Current = Cursors.Hand; 
       m.Result = (IntPtr)1; // Processed 
       return; 
      } 
     } 
     base.WndProc(ref m); 
    } 
+0

Thnx。阿尔多这修复了我所拥有的闪烁,这确实使部分其他“错误”成为可能。仅显示顶部和顶部调整大小的光标。 – jerone

+0

这似乎与您发布的代码段无关。我使用我发布的代码片段在所有边缘和角落获得了很好的调整大小的游标。测试命中测试代码是必不可少的,边缘和角落有不同的命中代码,它不会是2. –

+0

对不起,我转换它的错误。谢谢你的答案 – jerone