任何人都可以解释以下代码,该代码用于在c ++中执行Keylogger项目时隐藏控制台窗口
void hide();
int main()
{
hide();
MSG Msg;
//IO::MKDir(IO::GetOurPath(true));
//InstallHook();
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
//MailTimer.Stop();
return 0;
}
void hide()
{
HWND stealth;
AllocConsole();
stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(stealth, 0);
}
答案 0 :(得分:0)
让我们把它分成小块:
void hide();
int main()
{
hide();
MSG Msg;
//IO::MKDir(IO::GetOurPath(true));
//InstallHook();
while (GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
以上循环称为message pump。由于Windows GUI程序是事件驱动的,因此such a loop is the pattern将为Windows进程处理传入的 windows消息。当您的程序将收到WM_QUIT
消息时,GetMessage()
将返回FALSE
,并且循环将退出。 TranslateMessage()
可以将虚拟键消息转换为字符消息,以便在需要时进一步处理管道。 DispatchMessage()
可以确保发送到特定窗口的邮件将找到通往该窗口WindowProc callback的方式。
//MailTimer.Stop();
return 0;
}
void hide()
{
HWND stealth;
AllocConsole();
上面的最后一行是allocating a new console for the process.。如果您的进程已经有一个控制台,则此调用将失败,并返回零。
stealth = FindWindowA("ConsoleWindowClass", NULL);
FindWindowA()
的作用是将窗口句柄(HWND
)返回到具有指定类名和窗口名的窗口。在这里,它在省略名称(第二个参数)并仅指定类的情况下使用,在控制台窗口的情况下,该类只能有一个窗口,其类为"ConsoleWindowClass"
。
ShowWindow(stealth, 0);
}
All this line does正在隐藏由传递的句柄标识的窗口,这就是我们的控制台窗口,正如我们在代码段中已经知道的那样。在这种情况下,第二个参数0
是SW_HIDE
的枚举值,因此在此行之后,控制台窗口被隐藏。