1

スレッドが別のデスクトップに変更されると、AllocConsole()で作成された新しいコンソールが元のデスクトップに表示されます。作成されたメッセージボックスやその他のウィンドウは、期待どおりに新しいデスクトップに表示されますが、コンソールウィンドウは表示されません。次のコードはWindowsアプリケーションの例ですが、コンソールアプリケーションであるかどうかに関係なく、結果は同じです。

#include <Windows.h>

HDESK hDesk;

DWORD WINAPI Testing(void *)
{
    SetThreadDesktop(hDesk);
    AllocConsole();
    MessageBox(NULL, TEXT("Test"), NULL, MB_OK); //This will show on the new desktop
    FreeConsole();
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    hDesk=CreateDesktop(TEXT("Testing"),NULL,NULL,NULL,GENERIC_ALL,NULL);
    SwitchDesktop(hDesk);

    DWORD thr;
    HANDLE thread = CreateThread (0, 0, Testing, 0, 0, &thr);

    WaitForSingleObject (thread, 10000); //Wait 10 seconds before automatically exiting.

    SwitchDesktop(GetThreadDesktop(GetCurrentThreadId())); //Return to previous desktop
    CloseDesktop(hDesk);
    return 0;
}

2番目のデスクトップにコンソールウィンドウを作成するにはどうすればよいですか?

4

1 に答える 1

2

プロセスに接続された 1 つのコンソールはそのプロセスのすべてのスレッドによって共有され、コンソールがデスクトップからデスクトップに動的に移動するのではなく、プロセスが起動されたデスクトップにそのコンソールを配置することは理にかなっているため、この動作は理解できます。異なるデスクトップに接続されているスレッドによって割り当ておよび解放されます。また、このようなコンソール ウィンドウの移動が許可されている場合、コンソールがプロセス間で共有されている場合の動作を理解するのが難しくなります。

別のデスクトップ上のコンソールに関連付ける方法に関する質問に答えるために、ターゲット デスクトップで空のコンソール アプリケーション ウィンドウを開始することをお勧めします。やるべきことはすべて

int _tmain(int argc, _TCHAR* argv[])
{
Sleep(INFINITE);
return 0;
}

AllocConsole を呼び出す代わりに、新しく起動したプロセスのプロセス ID を指定して AttachConsole を呼び出し、GetStdHandle を呼び出してコンソール バッファーのハンドルを取得し、WriteConsole をさらに呼び出すことができます。

プロセスが (最初に) 接続されているターゲット デスクトップとは異なるターゲット デスクトップで新しいプロセスを起動するには、CreateProcess 呼び出しに渡される STARTUPINFO 構造にデスクトップ名を設定する必要があります。

于 2012-11-15T06:13:37.003 に答える