
ウィンドウのハンドルからファイル名を取得する方法について質問です。
GetWindowThreadProcessIdで、スレッドのIDを取得、
OpenProcessで、ハンドルを開く、
EnumProcessModulesで、モジュールのハンドルを取得、
GetModuleFileNameExで、パス名を取得、
でファイル名を取得しようとしているのですが一部のウィンドウのハンドルは失敗します。
Windows XPでは取得できるのですが、Windows 7では失敗します。
EnumProcessModulesで取得が失敗しているようです。
私の予想ではOpenProcessでのアクセス権の指定に問題があるのではと
思って調べてみたのですが分かりませんでした。
GetWindowModuleFileNameでも試してみたのですが、
取得に失敗します。
ちなみに、OpenProcessのアクセスフラグは
「PROCESS_QUERY_INFORMATION | PROCESS_VM_READ」です。
どうすればいいのでしょうか?
他の方法があれば、それでも構いません。
とにかく、他のウィンドウ(プロセス)のファイル名を取得出来れば、
どんな方法でも構いません。
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
Windows7 64bit、Visual Studio 2008 Standard、ビルド:x64
で試してみましたが、EnumProcessModules でのエラーはありませんでした。
普通に実行すると OpenProcess でのエラーが 22件となりましたが、「管理者として実行」で実行すると OpenProcess でのエラーは 2件になりました。
「管理者として実行」でも EnumProcessModules でのエラーはありませんでした。
BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam );
void OutputError( HWND hwnd, LPTSTR pMessage );
int _tmain(int argc, _TCHAR* argv[])
{
EnumWindows( EnumWindowsProc, 0 );
return 0;
}
BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
{
TCHAR fileName[ MAX_PATH ];
DWORD processID = NULL;
GetWindowThreadProcessId( hwnd, &processID );
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
if( hProcess ) {
HMODULE hModule = NULL;
DWORD dummy = 0;
if( EnumProcessModules( hProcess, &hModule, sizeof(HMODULE), &dummy ) ) {
memset( fileName, 0, MAX_PATH );
DWORD returnValue = GetModuleFileNameEx( hProcess, hModule, fileName, MAX_PATH );
if( returnValue ) {
_tprintf( _T("%08x:%s\n"), hwnd, fileName );
} else {
OutputError( hwnd, _T("GetModuleFileNameEx") );
}
} else {
OutputError( hwnd, _T("EnumProcessModules") );
}
CloseHandle( hProcess);
} else {
OutputError( hwnd, _T("OpenProcess") );
}
return TRUE;
}
void OutputError( HWND hwnd, LPTSTR pMessage )
{
TCHAR Caption[ 200 ];
DWORD errorCode = GetLastError();
_tprintf( _T("%08x:%s Error:%08x"), hwnd, pMessage, errorCode );
if( GetWindowText( hwnd, Caption, 200 ) ) {
_tprintf( _T(":%s\n"), Caption );
} else {
_tprintf( _T("\n") );
}
}
この回答への補足
調べてみると、Win32コンソールアプリケーションでは取得に成功するのですが、
Win32プロジェクトでは取得に失敗することが分かりました。
原因をもう少し調べてみようと思います。
回答ありがとうございます。
載せていただいたもので試してみたのですが、
エラーは出ませんでした。
何度も見直したのでミスはないとは思うのですが、
載せていただいたもので出来ているのでどこかが間違っているはずなので、
再度ミスが無いか確認してみようと思います。
No.1
- 回答日時:
もしかして、
Windows XP : 32bit
Windows7 : 64bit
実行するプログラム : Win32
だったりしませんか?
もし、64bit 環境なら、プラットフォームを x64 にしてビルドしないと x64 のプロセスのところでエラーになると思います。
この回答への補足
回答ありがとうございます。
環境を書き忘れてました。
すみません。
開発環境は、Windows7、64bit、Visual C++ 2010 Expressです。
プラットフォームはx64でビルドしています。
ちなみに、プラットフォームをx32でビルドしても失敗しました。
XPは32bitです。
空いている入力欄がここだけだったのでこちらで書かせていただきます。
新しくプロジェクトを作成して試したら取得できました。
作っているプロジェクト(ファイル)と、テスト用に前に作っていた
プロジェクトで試していて、
それでは失敗していたので、恐らくプロジェクトファイルが破損していたか、
設定が勝手に変わっていたのではないかと私の予想ですが、そう思います。
何が原因だったかは正確には分かりませんが、解決できて良かったです。
>調べてみると、Win32コンソールアプリケーションでは取得に成功するのですが、
>Win32プロジェクトでは取得に失敗することが分かりました。
と書いたのですが、関係ありませんでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) outlook マクロが終了しません。 1 2022/09/02 11:14
- その他(プログラミング・Web制作) バッチファイルでPCのモデル名を取得したい 1 2022/03/31 10:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) Excel VBA ファイル取得について フォルダの中に、ファイル名“会議“を含むファイルが1つまた 9 2022/10/12 01:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
xmlの宣言でエラーになってしま...
-
RightとLeft関数のライブ...
-
Handlesについて
-
コンパイル時のエラーメッセー...
-
VC++でのリンクエラー [err...
-
visual C++ でビルドの中止がで...
-
デバッグ中のエラーのことで教...
-
VC構文エラー、”:”
-
VisualStudio2010 VC++ エラー
-
Excelのエラーで困ってます。
-
ウィンドウのハンドルからファ...
-
visual studio 2019において、...
-
Wisual Windows for BC++ で O...
-
C言語のコンパイルができなく...
-
「指定したフォルダにあるファ...
-
VB2008で定数に色の設定をした...
-
stringについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
Excelのエラーで困ってます。
-
バッチからsqlplusの接続エラー...
-
visual C++ でビルドの中止がで...
-
適切な変換関数が存在しない???
-
VB2008で定数に色の設定をした...
-
デバッグ中のエラーのことで教...
-
fortranでプログラムを実行する...
-
RightとLeft関数のライブ...
-
ビルド失敗 指定されたファイ...
-
Handlesについて
-
HEWを使用しているのですが、こ...
-
DLL関数を使ったプログラム
-
キーの自動入力
-
Visual Studioのstrcpy_sについて
-
コンパイルできません。
-
multiple definitionというエラー
-
ACCESSのDate関数のエラー表示...
-
WindowsからLinuxへの移植
おすすめ情報