C++ 正在尝试挂接Notepad.exe
我正在尝试使用SetWindowsHookEx通过键盘钩住Notepad.exe 如您所见,工作线程正在将其ASCII代码(即wParam)发送到指定的服务器C++ 正在尝试挂接Notepad.exe,c++,windows,hook,C++,Windows,Hook,我正在尝试使用SetWindowsHookEx通过键盘钩住Notepad.exe 如您所见,工作线程正在将其ASCII代码(即wParam)发送到指定的服务器 UINT WINAPI SendToServer(LPVOID lpParam) { CSocket Client; Client.Create(); Client.Connect("localhost", 6677); Client.Send(lpParam, 2); // sending its A
UINT WINAPI SendToServer(LPVOID lpParam)
{
CSocket Client;
Client.Create();
Client.Connect("localhost", 6677);
Client.Send(lpParam, 2); // sending its ASICI code to Server
Client.Close();
return 0;
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
TCHAR szPath[MAX_PATH] = {0,};
TCHAR* p = nullptr;
if( nCode >= 0 )
{
// bit 31 : 0 => press, 1 => release
if( !(lParam & 0x80000000) )
{
GetModuleFileName(NULL, szPath, MAX_PATH);
p = strrchr(szPath, '\\');
if( !_stricmp(p + 1, "Notepad.exe") )
{
unsigned ThreadID;
g_hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, SendToServer, &wParam, 0, &ThreadID)); // a new working thread
return 0;
}
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
UINT WINAPI SendToServer(LPVOID lpParam)
{
CSocket客户端;
Client.Create();
Client.Connect(“localhost”,6677);
Send(lpParam,2);//将其ASICI代码发送到服务器
Client.Close();
返回0;
}
LRESULT回调KeyboardProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
TCHAR szPath[MAX_PATH]={0,};
TCHAR*p=nullptr;
如果(nCode>=0)
{
//位31:0=>按下,1=>释放
如果(!(LPRAM&0x8000000))
{
GetModuleFileName(NULL,szPath,MAX_PATH);
p=strrchr(szPath,“\\”);
如果(!\u stricmp(p+1,“Notepad.exe”))
{
无符号ThreadID;
g_hThread=reinterpret_cast(_beginthreadex(NULL,0,SendToServer,&wParam,0,&ThreadID));//一个新的工作线程
返回0;
}
}
}
返回CallNextHookEx(g_hHook、nCode、wParam、lParam);
}
问题是,由于与新工作线程相关的某些原因,记事本出现了一个严重错误(如果我多次单击“忽略”按钮,它仍然可以工作。)
我删除了下面这一行
g_hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, SendToServer, &wParam, 0, &ThreadID)); // a new working thread
g_hThread=reinterpret_cast(_beginthreadex(NULL,0,SendToServer,&wParam,0,&ThreadID));//一种新的工作线
则Notepad.exe中不会出现错误
任何帮助都将不胜感激
提前谢谢。这对你有用吗。。?硬编码路径仅用于测试目的 更改路径以匹配NotePad.exe所在的位置
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
ofstream fout;
fout.open("c:\\NotePad.exe",ios::app);
if (nCode < 0 || nCode != HC_ACTION)
return CallNextHookEx(hkb, nCode, wParam, lParam);
if ( (((DWORD)lParam & 0x80000000) == 0) && (HC_ACTION == nCode))
{
if ((wParam==VK_SPACE)||(wParam==VK_RETURN)||((wParam>=0x2f ) &&(wParam<=0x100)))
{
if(GetAsyncKeyState(wParam) == -32767) //this solve it i got it on google but how ??
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
fout<<char(w);
}
}
}
fout.close();
return CallNextHookEx(hkb, nCode, wParam, lParam);
}
LRESULT\uuuuu declspec(dllexport)\uuuuu stdcall回调键盘proc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
流式流量计;
打开(“c:\\NotePad.exe”,ios::app);
if(nCode<0 | | nCode!=HC|U动作)
返回CallNextHookEx(hkb、nCode、wParam、lParam);
如果(((DWORD)LPRAM&0x8000000)=0)和&(HC_操作==nCode))
{
如果((WPARAM==VKSY空间)”(WPARAM= = VKYREST)*((WPARAM > = 0x2F)& &(WPARAMAY)您确信这是C++吗?它看起来像C++一样可怕。抱歉,它是C++。没有添加C标签。为什么不知道C标签的添加。工作得很好。谢谢,不,不要改变匹配NoTPADAD.EXE所在的路径。。你不应该在你的应用程序中这样硬编码路径。如果你要发布用于测试的示例代码,你需要一个巨大的警告标志,上面闪烁着红灯,上面写着“永远不要在实际代码中这样做”。有趣的是..我在Delphi中编码了17年,所以我习惯了WinApi ShellExecute,所以代码很容易阅读。。我可以阅读C++,但是更喜欢C…新年快乐,我很高兴这对你有用。我同意Cody。所以如果你能…尝试用一个变量替换那个硬编码的路径,你可以通过配置或ini或其他机制来分配。