Выиграй API в C #.Событие MouseMove не может поймать быстрые ходы - PullRequest
0 голосов
/ 26 октября 2011

Я создал небольшое окно без границ с помощью функций WinApi в C #.Я хочу переместить это окно, когда нажата правая кнопка мыши.Я пытаюсь поймать смещение мыши при любом событии WM_MOUSEMOVE.Кажется, это работает, и я могу переместить мое окно, удерживая правую кнопку мыши.

Но я теряю контроль над окном, когда слишком быстро двигаю мышь.Это потому, что мое окно слишком маленькое, и если мышь покидает окно очень быстро, оно больше не получает сообщений WM_MOUSEMOVE, и я не могу рассчитать MouseOffset для перемещения моего окна.

Итак, как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

Вы можете сказать Windows, что пользователь фактически коснулся строки заголовка, и все остальное автоматически обработает для вас.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool ReleaseCapture();

[DllImport("user32.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

internal const uint WM_NCLBUTTONDOWN = 0xA1;

internal const int HTCAPTION = 2; // Window captions
internal const int HTBOTTOMRIGHT = 17; // Bottom right corner

/// <summary>
/// Simulates a Windows drag on the window border or title.
/// </summary>
/// <param name="handle">The window handle to drag.</param>
/// <param name="dragType">A HT* constant to determine which part to drag.</param>
internal static void DragWindow(IntPtr handle, int dragType) {
    User32.ReleaseCapture();
    User32.PostMessage(handle, User32.WM_NCLBUTTONDOWN, new IntPtr(dragType), IntPtr.Zero);
}
0 голосов
/ 26 октября 2011

Вам нужно вызвать SetCapture, чтобы сообщить Windows, что ваш hwnd хочет все события, даже если мышь физически не находится над окном.http://msdn.microsoft.com/en-us/library/windows/desktop/ms646262(v=vs.85).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...