我想写一个简单的程序,找到所有打开的窗口并显示它们的窗口名称;但是,在“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:\users\justin\documents\visual studio 2012\Projects\ConsoleApplication5\Debug\ConsoleApplication5.exe 1 1 ConsoleApplication5
Error 1 error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup c:\Users\Justin\documents\visual studio 2012\Projects\ConsoleApplication5\ConsoleApplication5\MSVCRTD.lib(crtexe.obj) ConsoleApplication5
答案 0 :(得分:4)
在你的控制台项目中,main函数必须被称为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)
,则它将指向标准主签名,如果它设置为{{1它会期望WinMain一个。
答案 1 :(得分:2)
在非控制台应用程序中,您可以使用API调用AllocConsole
(及其伙伴FreeConsole
)来创建(并销毁)控制台窗口。通常这是为了调试目的。
有许多功能允许您控制控制台窗口。有关详细信息,请参阅MSDN上的Console reference。
此外,标准输出与控制台绑定,因此如果需要,您可以使用cout
向其写入。
答案 2 :(得分:2)
作为一名自动用户,我真的不喜欢缺乏使生活更轻松的基本功能。如果您仍想在win32 gui Windows /SUBSYSTEM:CONSOLE
项目中使用标准控制台/SUBSYSTEM:WINDOWS
,我建议您使用此文件:
#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
无效。如果有人改进这些代码并使其也能正常工作,我会很高兴。无论如何,这是好的
更新:代码已更新,以支持std::cin
功能