Я пытаюсь переместить окно частично за верхнюю часть экрана. Тем не менее, поведение Windows по умолчанию вернет его обратно после того, как я закончу его перемещать. Да, я понимаю, почему эта конкретная функциональность существует; однако, я все еще не хочу это для моего окна. Затем я замечаю, что могу использовать SetWindowPos
, чтобы частично установить окно в верхней части экрана, и оно не откроется снова. Например, SetWindowPos(...., -100, -100, ....)
установит мое окно над экраном на 100 пикселей, и оно останется там.
Таким образом, вместо обычного перемещения окна (например, отправки SendMessage(hwnd, WM_SYSCOMMAND, SC_MOVE | 0x0002, 0);
, я хочу использовать SetWindowPos
для перемещения. Моя идея - обработать WM_MOUSEMOVE
и проверить, нажата ли левая кнопка мыши. Если левая кнопка мыши выключен, я вызываю SetWindowPos
с некоторой математикой, сделанной для текущей позиции мыши, предыдущих позиций мыши, и пропускаю ее через SetWindowPos
.
Пока у меня это работает, но не очень хорошо. Во-первых, если мышь движется быстро, она вообще не будет работать. Во-вторых, когда мышь движется медленно, окно дрожит при движении.
Вот мой WinProc:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int lastMouseX = 0;
static int lastMouseY = 0;
switch (message) /* handle the messages */
{
case WM_LBUTTONDOWN:
lastMouseX = LOWORD(lParam);
lastMouseY = HIWORD(lParam);
break;
//case WM_NCMOUSEMOVE:
case WM_MOUSEMOVE:
if(wParam == MK_LBUTTON)
{
int currentMouseX = LOWORD(lParam);
int currentMouseY = HIWORD(lParam);
int deltaX = currentMouseX - lastMouseX;
int deltaY = currentMouseY - lastMouseY;
RECT prc;
GetWindowRect(hwnd, &prc);
SetWindowPos(hwnd, NULL, prc.left + deltaX, prc.top + deltaY, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
lastMouseX = currentMouseX;
lastMouseY = currentMouseY;
}
break;
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Вот полный код http://pastebin.com/9A8iV5GW
Далее, проверяя сообщения Windows, я точно вижу, куда Windows перемещает окно вниз, но я все еще не знаю, что мне нужно делать. Я знаю, что это можно сделать, потому что я видел это в других приложениях.
<--I stop moving here with WM_LBUTTONUP -->
<windowMessage id="514" name="WM_LBUTTONUP">
<wParam>0x00000000</wParam>
<lParam>0x0049009E</lParam>
<returnValue>0x00000000</returnValue>
<-- And here is when windows moves it back down -->
</windowMessage><windowMessage id="534" name="WM_MOVING">
<wParam>0x00000009</wParam>
<lParam>0x003FF220</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage><windowMessage id="70" name="WM_WINDOWPOSCHANGING">
<wParam>0x00000000</wParam>
<lParam>0x003FEF98</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage><windowMessage id="36" name="WM_GETMINMAXINFO">
<wParam>0x00000000</wParam>
<lParam>0x003FEC20</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage><windowMessage id="71" name="WM_WINDOWPOSCHANGED">
<wParam>0x00000000</wParam>
<lParam>0x003FEF98</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage><windowMessage id="533" name="WM_CAPTURECHANGED">
<wParam>0x00000000</wParam>
<lParam>0x00000000</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage><windowMessage id="70" name="WM_WINDOWPOSCHANGING">
<wParam>0x00000000</wParam>
<lParam>0x003FF210</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage><windowMessage id="562" name="WM_EXITSIZEMOVE">
<wParam>0x00000000</wParam>
<lParam>0x00000000</lParam>
<returnValue>0x00000000</returnValue>
</windowMessage>