我试图挂钩例如记事本没有成功.制作全局钩子似乎工作正常.
在XP SP2上测试.
MyDLL代码
- #include <windows.h>
- #include <iostream>
- #include <stdio.h>
- HINSTANCE hinst;
- #pragma data_seg(".shared")
- HHOOK hhk;
- #pragma data_seg()
- //#pragma comment(linker,"/SECTION:.shared,RWS") compiler error in VC++ 2008 express
- LRESULT CALLBACK wireKeyboardProc(int code,WPARAM wParam,LPARAM lParam) {
- if (code < 0) {
- return CallNextHookEx(0,code,wParam,lParam);
- }
- Beep(1000,20);
- return CallNextHookEx(hhk,lParam);
- }
- extern "C" __declspec(dllexport) void install(unsigned long threadID) {
- hhk = SetWindowsHookEx(WH_KEYBOARD,wireKeyboardProc,hinst,threadID);
- }
- extern "C" __declspec(dllexport) void uninstall() {
- UnhookWindowsHookEx(hhk);
- }
- BOOL WINAPI DllMain(__in HINSTANCE hinstDLL,__in DWORD fdwReason,__in LPVOID lpvReserved) {
- hinst = hinstDLL;
- return TRUE;
- }
我的节目
- #include <Windows.h>
- unsigned long GetTargetThreadIdFromWindow(char *className,char *windowName)
- {
- HWND targetWnd;
- HANDLE hProcess;
- unsigned long processID = 0;
- targetWnd = FindWindow(className,windowName);
- return GetWindowThreadProcessId(targetWnd,&processID);
- }
- int _tmain(int argc,_TCHAR* argv[]) {
- unsigned long threadID = GetTargetProcessIdFromWindow("Notepad","Untitled - Notepad");
- printf("TID: %i",threadID);
- HINSTANCE hinst = LoadLibrary(_T("MyDLL.dll"));
- if (hinst) {
- typedef void (*Install)(unsigned long);
- typedef void (*Uninstall)();
- Install install = (Install) GetProcAddress(hinst,"install");
- Uninstall uninstall = (Uninstall) GetProcAddress(hinst,"uninstall");
- install(threadID);
- Sleep(20000);
- uninstall();
- }
- return 0;
- }
三个问题:
您应该在使用线程ID时使用进程ID.
你的HHOOK需要进入共享内存:
- #pragma data_seg(".shared")
- HHOOK hhk = NULL;
- #pragma data_seg()
- #pragma comment(linker,RWS")
您需要将HHOOK传递给CallNextHookEx:
- return CallNextHookEx( hhk,lParam);