我一直试图将输出句柄输出到我的控制台,但它似乎无法正常工作。我得到它来设置我的文字的颜色,但它没有改变。
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut, 0x0A)
我试图调试它,我认为我的处理方式并不正确。有没有其他方法可以做到这一点,它不起作用是正常的吗?任何修复?
谢谢!
编辑:让我澄清一下,我试图获得的句柄无效。我不知道如何修复它。我想我会开始寻找替代方案;也许我的代码有问题。
答案 0 :(得分:3)
标准处理程序在进程创建期间初始化,如果您调用botuser
新控制台很晚才创建。 AllocConsole
可以更改标准句柄,但启动代码使用它们为时已晚,例如C运行时库初始化。
在这种情况下,最好的做法是AllocConsole
,无论您是否连接到父进程的控制台,它都会获得一个控制台句柄,操作系统为您创建一个,因为您的PE头是CreateFileW(L"CONOUT$", ...)
或者你打电话给/SUBSYSTEM:CONSOLE
。即使重定向标准句柄,它也会获得控制台句柄。
如果您认为可以致电AllocConsole
,则应确保首先关闭FreeConsole
返回的所有句柄。在控制台保持活动直到进程退出的一般情况下,您可以让OS在进程清理期间为您关闭句柄。
答案 1 :(得分:1)
由于您指定hOut
为INVALID_HANDLE_VALUE
(或可能为NULL
),因此请尝试拨打GetLastError
以找出原因。您可能没有建立控制台会话。
这是一个win32控制台应用程序还是一个Windows SubSystem应用程序(它有WinMain
吗?)
您可以在AttachConsole(ATTACH_PARENT_PROCESS)
之前尝试AllocConsole
而不是GetStdHandle
。
在任何一种情况下,AllocConsole
和AttachConsole
都会返回BOOL
,如果FALSE
,则表示您可以致电GetLastError
查找原因。
在上面列出的行之前,请确保您没有呼叫hOut = GetStdHandle(STD_OUTPUT_HANDLE)
后跟CloseHandle(hOut)
。与AllocConsole
和FreeConsole
不同,关闭std句柄并不是一个好主意。
最后,试试:
在#define _WIN32_WINNT 0x0501
之前 #include <windows.h>
答案 2 :(得分:0)
对于这么小的事情这么多的戏剧......顺便说一下,@ Ben的回答是正确的答案实际上是正确的。
对于您的问题,请执行以下操作:
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
这将允许您获取任何控制台的句柄。确保在AllocConsole();
之前放置它享受?!
答案 3 :(得分:-1)
好的,我找到了答案。看起来像一个简单的编辑可以解决它
#define setcsattr(clr) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), clr)