2013-04-01 59 views
2

什麼是檢測窗口移動/其他進程將最好的辦法嗎?在Windows7 64位檢測/鉤窗口移動/拖動其他外部進程

我目前使用C++ & C#一個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對齊的代碼。這只是爲了好玩。

感謝您的任何幫助。

回答

2

一些額外的google搜索後,我發現了一個開源項目,它做幾乎正是我想要的。

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

它編譯容易沒有錯誤了。它在代碼中顯示它使用的是

SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, 

和鉤子程序的自定義dll。它也顯示了一些其他的技巧。從來沒有見過其他地方的SetWinEventHook。 upvote,如果你學到了什麼。

一些窗戶也當然是錯誤的該死。