gpt4 book ai didi

c++ - 使用 C 的 Windows 注销捕获

转载 作者:可可西里 更新时间:2023-11-01 09:38:14 26 4
gpt4 key购买 nike

我正在尝试使用 C 来捕获 Windows Server 2008 64 位系统上的注销事件。目前我正在使用此处所示的控制台注销事件代码:http://www.cplusplus.com/forum/beginner/1501/ (Gray Wolf 的第 6 条评论,他的第二个编码示例)将附在本文末尾。

这段代码有几个问题。它可以很好地独立运行,也可以在用户启动程序时运行。当我开始添加对我们的一些专有代码的调用时,它会停止捕获注销事件。没有 GUI 代码,这都是控制台。任何人都知道任何会阻止它工作的东西吗?这似乎很挑剔。

此外,如果该程序在登录期间由另一个程序自动启动(在用户级别启动并使用相同的 session ID,就像您双击 .exe 并自行激活它一样),它也无法捕获注销事件。任何想法都会很棒。

例子:这可以很好地独立运行,如果由用户手动启动。

#include <windows.h>
#include <tchar.h>
#include <signal.h>


BOOL WINAPI ConsoleHandler(
DWORD dwCtrlType // control signal type
);

static int startup;

int main(int argc, char *argv[])
{
if (SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE)
{
// unable to install handler...
// display message to the user
printf("Unable to install handler!\n");
return -1;
}

startup=1;

while(1)
{

}
}

BOOL WINAPI ConsoleHandler(DWORD CEvent)
{
char mesg[128];
static FILE * pFile;

char FileName[32] = "ControlHandle.txt";
if(startup) {
/* create the filename */

pFile = fopen(FileName, "at");
printf("creating a file\n");

fprintf(pFile, "This file contains the message when a control character is received.\n\n\n");
fclose(pFile);
startup=0;
}

switch(CEvent)
{
case CTRL_C_EVENT:
pFile = fopen(FileName, "at");
if(pFile > 0){
printf("Got File Handle");
}
fprintf( pFile,"in handler got an CTRL_C_EVENTevent\n" );
fclose(pFile);
break;
case CTRL_BREAK_EVENT:
pFile = fopen(FileName, "at");
fprintf( pFile,"in handler got an CTRL_BREAK_EVENTevent\n" );
fclose(pFile);
break;
case CTRL_CLOSE_EVENT:
pFile = fopen(FileName, "at");
fprintf( pFile,"in handler got an CTRL_CLOSE_EVENTevent\n" );
fclose(pFile);
break;
case CTRL_LOGOFF_EVENT:
pFile = fopen(FileName, "at");
fprintf( pFile,"in handler got an CTRL_LOGOFF_EVENTevent\n" );
fclose(pFile);
break;
case CTRL_SHUTDOWN_EVENT:
pFile = fopen(FileName, "at");
fprintf( pFile,"in handler got an CTRL_SHUTDOWN_EVENTevent\n" );
fclose(pFile);
break;

}
return TRUE;
}

最佳答案

您可以收听 WM_QUERYENDSESSIONWM_ENDSESSION消息。这在 GUI 和控制台应用程序中都有效,只要您有一个带有消息循环的窗口(不必可见)。

编辑:检查this thread ,尤其是上一篇文章中的代码。

额外信息:

关于c++ - 使用 C 的 Windows 注销捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16169305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com