глобальный хук для контроля позиции и размера окна.
От: nusik1990 Азербайджан  
Дата: 04.11.11 16:07
Оценка:
Здравствуйте товарищи.
Пишу 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?
Спасибо.
winapi global hook window positioning
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.