C を使用して、Windows Server 2008 64 ビット システムでログオフ イベントをキャプチャしようとしています。現在、私はここに示されているコンソール ログオフ イベント コードを使用しています: http://www.cplusplus.com/forum/beginner/1501/ (グレイ ウルフによる 6 番目のコメント、彼の 2 番目のコーディング例) は、この投稿の最後に添付されます。 .
このコードにはいくつかの問題があります。スタンドアロンでも、ユーザーがプログラムを起動しても問題なく動作します。独自のコードのいくつかに呼び出しを追加し始めると、ログオフ イベントのキャッチが停止します。GUI コードはありません。これはすべてコンソールです。これが機能しないようにするものを知っている人はいますか? それはかなり厄介なようです。
また、ログオン時にプログラムが別のプログラムによって自動的に開始された場合 (ユーザー レベルで開始され、.exe をダブルクリックして自分でアクティブ化した場合と同じセッション ID で開始された場合)、ログオフ イベントのキャプチャにも失敗します。どんなアイデアでも素晴らしいでしょう。
例: これはスタンドアロンでも、ユーザーが手動で開始した場合でも問題なく動作します。
#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;
}