1

WinFormを使用しているので、Windowsキャプション部分にあるときにカーソルを変更する必要があります。いくつかのコードが機能していますが、2つの問題があります。

  1. また、端にあるときにカーソルを変更します(通常のサイズ変更カーソルが表示されます)。このようなものが必要だとわかりましたWM_NCHITTESTHTTOP、どうすればそれを組み合わせることができますか?
  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;
    }
}

編集:
Spy++でメッセージを正しくログに記録していませんでした。ウィンドウの端の解決策を見つけました(更新されたコードを参照)。

Thnx、J

4

1 に答える 1

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);
    }
于 2011-06-26T14:43:05.617 に答える