Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在尝试挂接Notepad.exe_C++_Windows_Hook - Fatal编程技术网

C++ 正在尝试挂接Notepad.exe

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

我正在尝试使用SetWindowsHookEx通过键盘钩住Notepad.exe

如您所见,工作线程正在将其ASCII代码(即wParam)发送到指定的服务器

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或其他机制来分配。