3

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;
}
4

3 に答える 3

0

2つの方法があります

  • コンソールアプリケーションを使用している場合は、次を使用できます

    main()
    {
    ...
    SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlEventHandler, TRUE );
    ...
    }
    BOOL CtrlEventHandler(DWORD eventType)
    {
    if(eventType == CTRL_C_EVENT)
    {
    printf(""Sample text");
    return FALSE
    }
    else if(eventType == CTRL_LOGOFF_EVENT)
    {
    printf(""Sample text");
    return FALSE
    }
    }
    
  • Windows UI ベースのアプリケーションを使用している場合は、仮想関数 WindowProc を使用して以下のコードを使用できます。

    LRESULT CMainDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)    
    {
    if(message == WM_ENDSESSION)
    {
    if(lParam == ENDSESSION_LOGOFF)
    {
    /*Handle event*/
    }
    }
    return CDialogEx::WindowProc(message, wParam, lParam);
    }
    

    最初のオプションでは、この MSDN リンクを使用できます

于 2014-06-10T06:36:53.717 に答える
0

プログラムを最後まで実行し、ログオンの最初から開始する必要があるため、おそらくコードをサービスとして実装する必要があります。そうすれば、プログラムはシステム モードで実行され、完全なユーザー レベル (管理者プログラムを含む) を強制し始めても、プログラムをシャットダウンしません。

于 2013-05-10T13:37:58.473 に答える