6
के साथ बाहरी प्रक्रिया को कैसे हुक करें मैं बिना किसी आवश्यकता के नोटपैड उदाहरण के लिए हुक करने की कोशिश कर रहा हूं। एक वैश्विक हुक बनाना ठीक काम करता प्रतीत होता है।SetWindowsHookEx और WH_KEYBOARD
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, code, wParam, 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;
}
GetWindowThreadProcessId() धागा आईडी की जरूरत है देता है (इसकी वापसी मान के रूप में) । इनलाइन असेंबलर और रीडप्रोसेस मेमरी के साथ आप जो कुछ भी कर रहे हैं, वह आवश्यक नहीं है, और लगभग निश्चित रूप से काम नहीं कर रहा है। – RichieHindle
आपको 'hhk' से '0' को प्रारंभ करने की भी आवश्यकता है या इसे ठीक से साझा नहीं किया जाएगा – yoyoyoyosef
@Yoyoyoyosef: धन्यवाद - निश्चित। – RichieHindle