当一个线程更改为与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