メモ帳ウィンドウのタイトルを取得する方法。
あなたが尋ねる、
「「notepad.exe」プロセスに属する特定のウィンドウ名を1つ取得する必要があります」
ええと、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]
> _
最新のUnicodeC++Windowsプログラムの書き方。
また、言語の選択に加えて、C ++コードがTCHAR
型を使用してアドバタイズし、UnicodeとANSIの両方としてコンパイルできることを考慮してください。ただし、を使用しているため、Unicodeとしてコンパイルすることはできませんprintf
。これは、愚かTCHAR
すぎると、バグを導入するようにあなたを誤解させたことを意味します。T
単純に次のようなものを使用しないでくださいTCHAR
。これは、コードを難読化してバグを導入するための唯一の方法です。
Unicodeのみのプログラムを作成する方法を例示するコードを次に示します。
バッチファイルとは対照的に、これは1つのメモ帳ウィンドウのタイトルのみを取得します。
#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++コードは機能しません。この場合、DavidHeffermanが提案EnumWindows
するようにWindowsAPI関数を使用します。また、コードを読む人の難読化、微妙なバグ、誤解を招くことを避けるために、上記のコードで例示されているように、ではなくベースの文字列を使用してください。wchar_t
TCHAR