Đã thử một loạt các thứ nhưng tôi không thể làm cho nó hoạt động liên tục giữa thanh tác vụ của tôi bị nuked và các hiệu ứng siêu nhiên khác trên giao diện người dùng trên máy tính để bàn của tôi.Cách thêm hệ thống "móc cửa sổ" để được thông báo về cửa sổ đang được tạo/kích hoạt?
Đã thử sử dụng thư viện mở http://mwinapi.sourceforge.net/ trước tiên. Mặc dù nó hoạt động tốt như một lớp OO để liệt kê các cửa sổ và nội dung. Không thể móc đúng cách
Điểm dừng tiếp theo là Dino E.'s post on Windows Hooks in the .Net framework. Tôi đã kết thúc viết loại của riêng tôi khi tôi đã hiểu được văn bản và cố gắng để có được điều này để làm việc.
Ý định của tôi là chạy ứng dụng này và có thể ghi nhật ký tất cả các cửa sổ đã tạo khi đang chạy. Kêu gọi tất cả nhãn cầu ...
Cập nhật: snipped từ rõ ràng bạn can't write global windows hooks in .Net/mã số quản lý (trừ một số con chuột hoặc bàn phím mức móc thấp)
Vì vậy, tôi chuyển sang C++. Tuy nhiên, tất cả các cuộc gọi WinAPI đều trả về các xử lý hợp lệ nhưng tôi không thấy chức năng lọc của mình đang được gọi - dường như không nhận được bất kỳ thông báo nào. Vẫn không hoạt động ... Ai đó có thể phát hiện ra sai lầm.
void CWinHookFacade::Hook()
{
HMODULE hCurrentDll = LoadLibrary(_T("[Path to my hook dll]"));
m_HookHandle = SetWindowsHookEx(WH_CBT,
FilterFunctionForHook,
hCurrentDll,
0);
if (m_HookHandle == NULL)
{
throw new std::exception("Unable to hook");
}
}
void CWinHookFacade::Unhook()
{
if (!UnhookWindowsHookEx(m_HookHandle))
{
throw new std::exception("Unhook failed!");
}
m_HookHandle = NULL;
}
LRESULT CWinHookFacade::FilterFunctionForHook(int code, WPARAM wParam, LPARAM lParam)
{
if (code >= 0)
{
switch(code)
{
case HCBT_CREATEWND:
wprintf(_T("Created Window"));
break;
case HCBT_ACTIVATE:
wprintf(_T("Activated Window"));
break;
case HCBT_DESTROYWND:
wprintf(_T("Destroy Window"));
break;
}
}
return CallNextHookEx(m_HookHandle, code, wParam, lParam);
}
Khách hàng exe gọi Hook_DLL như thế này
int _tmain(int argc, _TCHAR* argv[])
{
CWinHookFacade::Hook();
getchar();
CWinHookFacade::Unhook();
}
Để làm rõ - SetWindowsHookEx trả về một xử lý hợp lệ mỗi lần. Ngoài ra trong trường hợp bất cứ ai muốn thử điều này, mã trên không có bất kỳ phụ thuộc nào khác. Dán vào một tệp .cs trong một dự án trống và chạy. – Gishu