前提・実現したいこと
初めて投稿します。
WindowsAPIを使用して、起動したアプリやファイルのWindowを正しく探すテストプログラムを作って評価しています。目的のWindowを探せますが、下記の結果のように、それ以外のWindowもヒットしてしまいます。異なるWindow同士でProsessIdが同じ値を持つことはないと認識していました。このような現象は正常な動作なのでしょうか。ネット上のサンプルも参考にさせていただいて特に違いはないように思いますが、なぜか日本語入力フロントエンドがヒットするのか不明です。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
【SampleU.cpp】 //--------------------------------------------------------------------------- #include <vcl.h> #include <Windows.h> #pragma hdrstop #include "SampleU.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { wchar_t lpResult; wchar_t Result[1024]; wchar_t _str[1024]; String str, str1; ZeroMemory(&si, sizeof(STARTUPINFOW)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFOW); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; str = L"C:\\Windows\\System32\\notepad.exe D:\\Mydesktop\\memo.txt"; CreateProcessW( NULL, str.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); WaitForSingleObject(pi.hProcess, 1000); EnumWindows(EnumWindowsProc, (LPARAM)&pi); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject Sender) { Memo1->Lines->Clear(); } //--------------------------------------------------------------------------- //■hWnd:トップウィンドウのハンドル、 LPARAM lParam ← (LPARAM)pi.hProcess //------------------------------------------------------------ BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { PROCESS_INFORMATION p = (PROCESS_INFORMATION*)lParam; DWORD pid = 0; GetWindowThreadProcessId(hWnd, &pid); wchar_t _Title[1024]; String Title; GetWindowTextW(hWnd, _Title, 1024); Title = _Title; if (pid == p->dwProcessId) { Form1->Memo1->Lines->Add(L"-----"); Form1->Memo1->Lines->Add(L"Title = " + Title); Form1->Memo1->Lines->Add(L"pid = " + IntToStr((int)pid)); Form1->Memo1->Lines->Add(L"p->dwProcessId = " + IntToStr((int)p->dwProcessId)); Form1->Memo1->Lines->Add(L"hWnd = " + IntToStr((int)hWnd)); } return true; } //--------------------------------------------------------------------------- 【SampleU.h】 //--------------------------------------------------------------------------- #ifndef SampleUH #define SampleUH //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> #include <Vcl.ExtCtrls.hpp> #include <Vcl.Dialogs.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント TPanel *Panel1; TMemo *Memo1; TButton *Button1; TButton *Button2; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject Sender); private: // ユーザー宣言 STARTUPINFOW si; PROCESS_INFORMATION pi; public: // ユーザー宣言 __fastcall TForm1(TComponent Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
試したこと
ソースコードをコンパイルして実行したところ、同一のプロセスIdのWindowを下記のように4個ヒットしました。
補足情報
-----
Title = ATOK30TIP UI Window Name
pid = 3076
p->dwProcessId = 3076
hWnd = 3869068
-----
Title = memo.txt - メモ帳
pid = 3076
p->dwProcessId = 3076
hWnd = 330382
-----
Title = MSCTFIME UI
pid = 3076
p->dwProcessId = 3076
hWnd = 6949362
-----
Title = Default IME
pid = 3076
p->dwProcessId = 3076
hWnd = 1247030
以上、ご教授ください。
回答2件
あなたの回答
tips
プレビュー