【发布时间】:2012-11-15 03:58:22
【问题描述】:
当线程更改为不同的桌面时,使用 AllocConsole() 创建的新控制台会出现在原始桌面中。如预期的那样,创建的消息框和其他窗口会出现在新桌面中,但控制台窗口不会。下面的代码是一个windows应用的例子,不管是不是console应用,结果都是一样的。
#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] 创建和维护的。考虑使用 Console2 或 Cygwin 中的替代方法,而不是 Windows 控制台窗口。
-
我怀疑这是因为控制台窗口与进程相关联,而不是与线程相关联。因此,如果要更改创建控制台窗口的桌面,则必须设置主线程的桌面。它也可能与能够附加到单个控制台的多个进程有关。
-
设置主线程的桌面似乎对我不起作用。
-
这只是假设。可能是控制台窗口始终位于进程启动时处于活动状态的桌面上。这可能是一个疏忽。很难说。
-
@JimMischel,确实如此。最好明确指出可能的解决方案不起作用,这样更多的人就不会尝试并一无所获:)