當一個線程更改爲與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;
}
如何在第二個桌面創建控制檯窗口?因爲連接到進程的一個控制檯通過該進程的所有線程共享,這是有道理的把那個控制檯上的過程中推出,而不是動態地從桌面移動控制檯在桌面上
我懷疑的行爲是因爲控制檯窗口創建和由[CSRSS.EXE]保持。而不是Windows控制檯窗口,請考慮替代方法,如Console2或Cygwin中的方法。 –
我懷疑這是因爲控制檯窗口與進程而不是與線程相關聯。因此,如果您想更改創建控制檯窗口的桌面,則必須設置主線程的桌面。它也可能與多個進程能夠連接到單個控制檯有關。 –
設置主線程的桌面似乎不適用於我。 – chris