Обнаружение / перехват окна Перемещение / перетаскивание других внешних процессов

Как лучше всего обнаружить перемещение/перетаскивание окна других процессов? В Windows7 64-бит

В настоящее время я изучаю глобальные хуки из DLL с использованием С++ и С#. Это боль, так как он не хочет работать должным образом. Я добился некоторого успеха с крючками для клавиатуры и мыши. но для оконных сообщений я просто понятия не имею, что не так.

это код в моем файле .dll

#include <windows.h>
#include <iostream>
#include <stdio.h>

HINSTANCE hinst;
#pragma data_seg(".shared")
HHOOK hhk;
WNDPROC realProc;
#pragma data_seg()
//#pragma comment(linker, "/SECTION:.shared,RWS") compiler error in VC++ 2008 express

LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) {  
    //open the standard out stream for writing
    freopen("CONOUT$","w+t", stdout);
    printf("code:%d wparam:%d lparam:%d\n", code, wParam, lParam);

    /*
    if (code < 0) {
        return CallNextHookEx(0, code, wParam, lParam);
    }
    */
    //Beep(1000, 20);

    return CallNextHookEx(hhk, code, wParam, lParam);
}

LRESULT CALLBACK hookProc(HWND h, UINT msg, WPARAM wp, LPARAM lp)
{
    //open the standard out stream for writing
    freopen("CONOUT$","w+t", stdout);
    printf("h:%d msg:%d wp:%d lp:%d\n", h, msg, wp, lp);
    return CallWindowProc(realProc, h, msg, wp, lp);
}

extern "C" __declspec(dllexport) void install(unsigned long threadId, HWND hwnd) {
    //open the standard out stream for writing
    freopen("CONOUT$","w+t", stdout);

    //works for WH_KEYBOARD WH_MOUSE but doesnt work for WH_CALLWNDPROC
    hhk = SetWindowsHookEx(WH_CALLWNDPROC, wireKeyboardProc, hinst, threadId);
    printf("threadId: %d xxx: %d\n", threadId, hhk);

    /*
    //dont know whats wrong the return value of realProc is 0
    realProc = (WNDPROC)SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)hookProc);
    printf("hwnd: %d xxx: %d\n", hwnd, realProc);
    */
}

extern "C" __declspec(dllexport) void uninstall() {
    UnhookWindowsHookEx(hhk); 
}

BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in  DWORD fdwReason, __in  LPVOID lpvReserved) {
    hinst = hinstDLL;
    return TRUE;
}

Я думал сделать свой собственный Aero Snap. Это просто для удовольствия.

Спасибо за любую помощь.


person ColacX    schedule 01.04.2013    source источник


Ответы (1)


После некоторого дополнительного поиска в Google я нашел проект с открытым исходным кодом, который делает почти то, что я хочу.

http://sourceforge.net/projects/powerresizer/

он тоже легко компилируется без ошибок. это показывает в коде, который он использует

SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND,

и пользовательская dll для процедуры ловушки. он также показывает некоторые другие трюки. никогда не видел SetWinEventHook где-либо еще. голосуйте, если вы что-то узнали.

блин конечно глючит и с некоторыми окнами.

person ColacX    schedule 02.04.2013