gpt4 book ai didi

c++ - 为什么 MessageBox 在我创建的桌面显示窗口,而 AllocConsole 在之前显示它?

转载 作者:行者123 更新时间:2023-11-30 04:23:24 26 4
gpt4 key购买 nike

当线程更改为不同的桌面时,使用 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;
}

如何在第二个桌面上创建控制台窗口?

最佳答案

这种行为是可以理解的,因为附加到进程的一个控制台由该进程的所有线程共享,并且将该控制台放在启动进程的桌面上而不是动态地将控制台从桌面移动到桌面是有意义的因为控制台是由连接到不同桌面的线程分配和释放的。如果控制台窗口的这种移动被允许,当控制台在进程之间共享时,行为将更难以理解。

要回答有关如何与不同桌面上的控制台相关联的问题,我建议在目标桌面上启动一个空白的控制台应用程序窗口,其主要职责是保持控制台窗口处于事件状态。所有要做的就是照做

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

并且不调用 AllocConsole,而是使用新启动进程的进程 ID 调用 AttachConsole,然后调用 GetStdHandle 以获取控制台缓冲区的句柄,以便进一步调用 WriteConsole。

要在与进程(最初)连接到的桌面不同的目标桌面中启动新进程,您必须在将传递给 CreateProcess 调用的 STARTUPINFO 结构中设置桌面名称。

关于c++ - 为什么 MessageBox 在我创建的桌面显示窗口,而 AllocConsole 在之前显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com