2012-11-15 34 views
1

當一個線程更改爲與AllocConsole()創建了一個不同的桌面新遊戲機出現在原來的桌面。如預期的那樣,創建的消息框和其他窗口顯示在新桌面中,但控制檯窗口不顯示。下面的代碼是一個Windows應用程序示例,但它的結果仍然是一樣的,無論它是否是控制檯應用程序。爲什麼MessageBox在我創建的桌面上顯示窗口,但AllocConsole在前面顯示它?

#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

我懷疑的行爲是因爲控制檯窗口創建和由[CSRSS.EXE]保持。而不是Windows控制檯窗口,請考慮替代方法,如Console2或Cygwin中的方法。 –

+0

我懷疑這是因爲控制檯窗口與進程而不是與線程相關聯。因此,如果您想更改創建控制檯窗口的桌面,則必須設置主線程的桌面。它也可能與多個進程能夠連接到單個控制檯有關。 –

+0

設置主線程的桌面似乎不適用於我。 – chris

回答

2

這種行爲是可以理解的作爲控制檯的桌面通過連接到不同桌面的線程分配和釋放。如果允許控制檯窗口的這種移動,那麼當控制檯在進程之間共享時,行爲會更難理解。

爲了回答關於如何使用控制檯關聯不同的桌面上的問題,我建議從目標臺式機,其主要職責是將只保留控制檯窗口活在一個空白的控制檯應用程序窗口。所有這些都是需要做的就是做的

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

而不是調用AllocConsole,調用AttachConsole與新推出的進程的進程ID,然後調用GetStdHandle得到處理,爲進一步呼籲WriteConsole控制檯緩衝區。

要在與目標桌面不同的目標桌面啓動新進程(首先)將連接到您將不得不在STARTUPINFO結構中設置將傳遞給CreateProcess調用的桌面名稱。

+0

很奇怪...'dwProcessId'包含一個有效的PID,但'AllocConsole'失敗什麼的意思根據文件,這是不存在的過程。 – chris

+0

@chris您的意思是AttachConsole。可能是有效的PID在AttachConsole調用時沒有控制檯。 – nanda

+0

是的,我的意思是,謝謝。哦,嘿,'AttachConsole'前的一個'Sleep()'。我認爲'????的輸出Writ'只是我:P – chris

相關問題