如何使用SetWindowsHookEx和WH_KEYBOARD挂钩外部进程
发布时间:2020-12-14 04:32:41 所属栏目:Windows 来源:网络整理
导读:我试图挂钩例如记事本没有成功.制作全局钩子似乎工作正常. 在XP SP2上测试. 编辑:修改后的代码现在有效. MyDLL代码 #include windows.h#include iostream#include stdio.hHINSTANCE hinst;#pragma data_seg(".shared")HHOOK hhk;#pragma data_seg()//#pragm
我试图挂钩例如记事本没有成功.制作全局钩子似乎工作正常.
在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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- windows – 获取磁盘/群集号上的文件偏移量
- windows-server-2003 – 如何为远程桌面用户设置超时?
- windows-server-2016 – 在Server 2016上使用S2D配置SOFS有
- wix – Windows 10上的VersionNT MSI属性
- windows – 像GotoMeeting这样的软件如何捕获桌面图像?
- wpf – 如何在关闭处理程序中区分“窗口关闭按钮单击(X)”与
- windows – 将PID从任务列表传递到taskkill,以通过它保持打
- wpf – 如何停止每次打开一个新窗口?
- active-directory – 获取域/树中的AD组路径
- windows – 为什么从Jenkins(但在其他地方)调用时,exit / b