检测窗口移动/拖动其他进程的最佳方法是什么? 在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 Snap。 这只是为了好玩。
谢谢你的帮助。
经过一些额外的谷歌搜索,我发现一个开源项目,几乎完全是我想要的。
http://sourceforge.net/projects/powerresizer/
它编译容易,也没有错误。 它显示在它使用的代码中
SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND,
和一个自定义的钩子程序的DLL。 它也显示了一些其他的技巧。 从来没有见过其他地方的SetWinEventHook。 upvote,如果你学到了什么。
该死的,当然它也有一些窗户bug。