如何获取记事本窗口的标题。
你问,
“我需要获取一个属于“notepad.exe”进程的特定窗口名称”
好吧,C++ 是该任务的错误语言。这是一项通过脚本更自然、更简单的任务。例如,这是一个报告所有记事本窗口标题的 Windows 批处理文件:
@echo off
for /f "usebackq delims=, tokens=1,9" %%t in (`tasklist /v /fo csv`) do (
if %%t=="notepad.exe" echo %%u
)
示例使用:
[d:\dev\misc\so\notepad_window_name]
>标题
“无标题 - 记事本”
[d:\dev\misc\so\notepad_window_name]
> _
如何编写现代 Unicode C++ Windows 程序。
此外,除了语言选择之外,请考虑您的 C++ 代码通过其使用TCHAR
类型来宣传,它可以编译为 Unicode 和 ANSI——但由于使用printf
. 这意味着过于愚蠢的TCHAR
做法会误导您引入错误。简单地不要使用这些T
东西,比如TCHAR
:它只是一种混淆代码和引入错误的方法。
下面的代码举例说明了如何创建一个纯 Unicode 程序。
与批处理文件相比,这仅检索一个记事本窗口的标题:
#include <iostream> // std::wcout, std::endl
#include <stdlib.h> // EXIT_FAILURE, EXIT_SUCCESS
#include <string> // std::wstring
using namespace std;
#define UNICODE
#include <windows.h>
int main()
{
HWND const window = FindWindow( L"Notepad", nullptr );
if( window == 0 )
{
wcerr << "!Didn't find any Notepad window." << endl;
}
else
{
int const nAttempts = 3;
for( int i = 1; i <= nAttempts; ++i )
{
int const bufferSize = 1 + GetWindowTextLength( window );
wstring title( bufferSize, L'\0' );
int const nChars = GetWindowText( window, &title[0], bufferSize );
if( nChars == 0 || nChars < GetWindowTextLength( window ) )
{
Sleep( 20 ); continue;
}
title.resize( nChars );
wcout << "'" << title << "'" << endl;
return EXIT_SUCCESS;
}
wcerr << "!Found a Notepad window but unable to obtain the title." << endl;
}
return EXIT_FAILURE;
}
因此,C++ 是错误的语言选择,TCHAR
也是完全错误的数据类型选择。
当其他要求强制选择语言时如何使用 C++。
如果出于某种原因您确实需要 C++ 形式的代码,并且确实需要所有记事本窗口标题,那么批处理文件将无法使用,而上述 C++ 代码也无法使用。在这种情况下,请按照 David Hefferman的建议使用 Windows EnumWindows
API 函数。并且为了避免混淆、细微的错误和误导阅读代码的其他人,请使用基于字符串,而不是,如上面的代码所示。wchar_t
TCHAR