Обнаружение / Перемещение окна хука / Перетаскивание других внешних процессов
Каков наилучший способ обнаружения перемещения окна / перетаскивания других процессов? В Windows7 64-битная
В настоящее время я изучаю Global Hooks из DLL с использованием C++ и C#. Это боль, потому что она не хочет работать должным образом. Я получил некоторый успех с крючками клавиатуры и мыши. но для оконных сообщений я просто понятия не имею, что не так.
это код в моем файле.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. Это просто для удовольствия.
Спасибо за любую помощь.
1 ответ
После некоторого дополнительного поиска я нашел проект с открытым исходным кодом, который делает почти то, что я хочу.
http://sourceforge.net/projects/powerresizer/
он легко компилируется без ошибок. это показывает в коде, который он использует
SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND,
и пользовательские DLL для процедуры подключения. это также показывает некоторые другие уловки. никогда не видел SetWinEventHook где-либо еще. upvote, если вы узнали что-то.
черт, конечно, это также вызывает ошибки в некоторых окнах.