3 votes

Détecter / Accrocher le déplacement / glissement de fenêtre d'autres processus externes

Quel est le meilleur moyen de détecter le déplacement/déplacement de fenêtre d'autres processus? Sous Windows7 64 bits

Je suis actuellement en train d'étudier les Hooks Globaux à partir d'une DLL en utilisant C++ & C#. C'est pénible car ça ne fonctionne pas correctement. J'ai eu un certain succès avec les hooks clavier et souris, mais pour les messages de fenêtre, je n'ai aucune idée de ce qui ne va pas.

Voici le code dans mon fichier .dll

#include 
#include 
#include 

HINSTANCE hinst;
#pragma data_seg(".shared")
HHOOK hhk;
WNDPROC realProc;
#pragma data_seg()
//#pragma comment(linker, "/SECTION:.shared,RWS") erreur de compilation dans VC++ 2008 express

LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam,LPARAM lParam) {  
    //ouvre le flux de sortie standard pour l'écriture
    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)
{
    //ouvre le flux de sortie standard pour l'écriture
    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) {
    //ouvre le flux de sortie standard pour l'écriture
    freopen("CONOUT$","w+t", stdout);

    //fonctionne pour WH_KEYBOARD WH_MOUSE mais ne fonctionne pas pour WH_CALLWNDPROC
    hhk = SetWindowsHookEx(WH_CALLWNDPROC, wireKeyboardProc, hinst, threadId);
    printf("threadId: %d xxx: %d\n", threadId, hhk);

    /*
    //ne sais pas ce qui ne va pas, la valeur de retour de realProc est 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;
}

J'envisageais de créer mon propre Aero Snap. C'est juste pour le plaisir.

Meri pour toute aide.

5voto

ColacX Points 766

Après quelques recherches supplémentaires, j'ai trouvé un projet open source qui fait presque exactement ce que je veux.

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

il se compile facilement sans erreur. Il montre dans le code qu'il utilise

SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND,

et une dll personnalisée pour la procédure de crochet. Il montre également quelques autres astuces. Je n'ai jamais vu SetWinEventHook ailleurs. Upvote si vous avez appris quelque chose.

Dommage, bien sûr, cela bug avec certains autres fenêtres aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X