我想编写一个简单的程序来查找所有打开的窗口并显示它们的窗口名称;但是,在“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
最佳答案
在您的控制台项目中,必须调用 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 签名。关于c++ - Visual Studio : how to get output in "Win32" project,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17938275/