Visual Studio:如何在"Win32"项目中获取输出
Visual Studio: how to get output in "Win32" project
我想写一个简单的程序,找到所有打开的窗口并显示它们的窗口名称;然而,在"Win32项目"下的Visual Studio中,控制台并不能通过"cout"函数输出任何内容。
但是,如果我试图将代码放在"Win32控制台"项目下,我会收到关于外部依赖关系的错误(所以我认为我就是做不到?)。
那么,有什么方法可以将控制台添加到"Win32"项目中吗?
有问题的代码(当然是未完成的):
// ConsoleApplication2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR lpCmdLine, int nCmdShow){
EnumWindows(EnumWindowsProc, NULL);
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam){
LPTSTR title = 0;
GetWindowText(hwnd, title, sizeof(title));
cout << "Window Name: " << endl;
return TRUE;
}
最后但同样重要的是,当我试图在"Win32控制台"项目中运行代码时,我会遇到错误。
Error 2 error LNK1120: 1 unresolved externals c:usersjustindocumentsvisual studio 2012ProjectsConsoleApplication5DebugConsoleApplication5.exe 1 1 ConsoleApplication5
Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup c:UsersJustindocumentsvisual studio 2012ProjectsConsoleApplication5ConsoleApplication5MSVCRTD.lib(crtexe.obj) ConsoleApplication5
在控制台项目中,必须调用main函数,而不是WinMain。
#include <iostream>
#include <windows.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam)
{
LPTSTR title = 0;
GetWindowText(hwnd, title, sizeof(title));
std::cout << "Window Name: " << std::endl;
return true;
}
int main(int argc, char* argv[]) // SUBSYSTEM:CONSOLE
//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR lpCmdLine, int nCmdShow) // SUBSYSTEM:WINDOWS
{
EnumWindows(EnumWindowsProc, NULL);
std::cin.get();
return 0;
}
这将适用于Win32控制台应用程序项目。这正是您的代码,但我将WinMain函数的签名更改为标准main。
要知道应该使用这两个签名中的哪一个,请检查以下设置:Properties -> Linker -> System -> SubSystem
,如果设置为Console (/SUBSYSTEM:CONSOLE)
,则需要标准主签名;如果设置为Windows (/SUBSYSTEM:WINDOWS)
,则需要WinMain签名。
在非控制台应用程序中,您可以使用API调用AllocConsole
(及其好友FreeConsole
)来创建(和销毁)控制台窗口。通常这样做是为了调试目的。
还有许多功能允许您控制控制台窗口。有关详细信息,请参阅MSDN上的控制台参考资料。
此外,标准输出绑定到控制台,因此如果需要,可以使用cout
对其进行写入。
作为一名Autoit用户,我真的不喜欢缺少让生活更轻松的基本功能。如果您仍然想在win32 gui Windows /SUBSYSTEM:WINDOWS
项目中使用标准控制台/SUBSYSTEM:CONSOLE
,我建议您使用以下文件:
#pragma once
#include <stdio.h>
FILE *g_ic_file_cout_stream; FILE *g_ic_file_cin_stream;
// Success: true , Failure: false
bool InitConsole()
{
if (!AllocConsole()) { return false; }
if (freopen_s(&g_ic_file_cout_stream, "CONOUT$", "w", stdout) != 0) { return false; } // For std::cout
if (freopen_s(&g_ic_file_cin_stream, "CONIN$", "w+", stdin) != 0) { return false; } // For std::cin
return true;
}
保存为InitConsole.h.
在您的代码区域中,第一个#include "InitConsole.h"
。然后-在使用std::cout
之前,首先调用InitConsole();
。请确保它没有返回false。如果返回false,则无法创建和初始化控制台。
此外,它不会在VS 2015中触发恼人的警告。
我不明白为什么没有这样一个基本的功能。我建议您保留此文件,以便将来在任何win32 gui项目中重复使用(用于调试目的)。
注意:我是C++的新手,所以如果我在代码中做错了什么,那么更欢迎修复
编辑:std::cin
不工作。如果有人能改进这个代码并使它也能工作,我会很高兴的。不管怎样,它仍然很好
UPDATE:更新代码以支持std::cin
功能
- 对于我在 Microsoft Visual C++ IDE (2005 或更高版本)的本机 win32 项目中编写的应用
- 在网站上发布 Win32 项目
- win32 C++项目中的输入超时
- 为什么从 win32 项目链接到 x64 库时会出现链接错误
- 默认Win32项目具有恒定数量的内存泄漏
- 有没有一种简单的方法可以将多个资源添加到 Win32/C++ 项目
- MySQL数据库连接到一个c++win32项目
- Win32 项目中的可视化C++字符可视化
- Win32 项目生成 MFC 错误
- Visual Studio:如何在"Win32"项目中获取输出
- 将.exe转换为 .dll Win32 项目并防止在出现致命错误时退出
- 什么是visual c++中的win32项目?
- 如何在Win32项目c++中添加几个项目到列表框
- 如何在Win32项目中添加控制台窗口,Visual Studio 2010
- 当我在win32项目c++应用程序中单击菜单项时,如何编写代码来加载一个特殊的对话框?
- 如何在Visual Studio c++ Win32项目中填充组合框
- 从相同的解决方案在Win32项目中使用DLL项目
- 将cocos2d-x win32项目移植到Android时出错
- 在两个 Visual Studio 2010 C++ 项目(DLL 和 Win32 项目)中共享头文件
- 图像 (PNG) 未显示在 c++ Win32 项目的最终执行中