Здравствуйте товарищи.
Пишу winapi приложение которое запускает различные приложения (notepad например).
После запуска notepad-а, моя программа должна контролировать размер и позицию окна notepad-а.
Задается прямоугольник, за границы которого notepad не должен выходить.
Установил два глобальных хука:
1. WH_CBT хук (код HCBT_ACTIVATE) (просто запрещает изменение размера окна notepad) Как ловить изменения в размерах окна?
HCBT_MOVESIZE бесполезен ибо нужно чтобы окно за границы заданного прямоугольника никогда не выходили.
static HWND notepadWND = NULL;
__export
LRESULT CALLBACK CBTHookProc( int nCode, WPARAM wParam,LPARAM lParam)
{
DWORD style;
if (nCode < 0)
return CallNextHookEx(NULL, nCode, wParam, lParam);
if (!notepadWND)
notepadWND = FindWindow("Notepad",NULL);
if (notepadWND == (HWND)wParam)
{
//WH_CBT codes
switch (nCode)
{
case HCBT_ACTIVATE:
//SYSMSGFILTER proc should be with this params:
//style = WS_VISIBLE & WS_SYSMENU & WS_DLGFRAME;
style = GetWindowLong(notepadWND, GWL_STYLE);
SetWindowLong(notepadWND, GWL_STYLE, style & ~WS_THICKFRAME & ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX);
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
2. WH_CALLWNDPROC хук — при перемещении окна notepad-а таким методом остается "шлейф", поскольку данный хук не отменяет перемещения, а просто возвращает окно на место с которого началось перемещение.
static int window_moved = 0;
__export
LRESULT CALLBACK CWHookProc( int nCode, WPARAM wParam, LPARAM lParam )
{
DWORD style; MSG msg = {0}; HDC notepadDC;
if (nCode < 0)
return CallNextHookEx(NULL, nCode, wParam, lParam);
if (!notepadWND)
notepadWND = FindWindow("Notepad",NULL);
CWPSTRUCT cwp = *(LPCWPSTRUCT)lParam;
if (cwp.hwnd == notepadWND)
{
switch (cwp.message)
{
case WM_WINDOWPOSCHANGING:
window_moved = 0;
break;
case WM_MOVE:
if (!window_moved)
{
MoveWindow(notepadWND,100,100,300,300,TRUE);
window_moved = 1;
break;
}
break;
case WM_MOVING:
if (!window_moved)
{
MoveWindow(notepadWND,100,100,300,300,TRUE);
window_moved = 1;
break;
}
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Есть ли такой хук позволяющий ловить перемещения окна с возможностью изменить или отменить перемещение без "шлейфа"?
WH_SYSMSGFILTER работает для диалогов, месседж боксов и пр., (проверял для notepad-а — не работает, ибо не диалог, также пытался изменить стиль окна notepad-а на WS_DLGFRAME тоже FAIL.
Можно ли как-нибудь изменить стиль окна notepad на диалоговый стиль чтобы ловить WH_SYSMSGFILTER?
Спасибо.