返信有難う御座います。
> EnumWindows()とか、FindWindow()とかでウィンドウハンドルを列挙したあと、GetWindowThreadProcessID()あたりで、呼び出し側のプロセスID等を比較して探し出すしかないかと思われます。
何も書かないですみませんでした。
私もそう思って色々試してみました。
下記コードであればEnumProcessModulesまでは成功しますが、モジュール名が取得で失敗する様です。
取得したいウィンドウハンドルのアプリは既に出来上がったものでして、何も出来ないのが現状です。
何をしたいのかともうしますと、呼び出し元のタイトルバーのTEXTを取得したいのです。
しかしながら、複数インストールが可能で、複数起動するWindowアプリケーションのため、
このDLLが呼ばれた際に呼び出し元のアプリケーションが分かればと思ったのです。
下記コードでやりたい事は、呼び出し元のEXEのPATHとDLLのPATHを比較して特定しようと考えているものです。
GetModuleFileNameExで失敗するため、EXEのPATHと比較できずにいます。
ご教授御願いします。
char g_mName[MAX_PATH];
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
//クラス名取得
char name[1024];
::GetClassNameA(hWnd, name, sizeof(name));
if(::strcmp("アプリケーションクラス名", name) != 0)
{
return TRUE;
}
//プロセスID取得
DWORD pid = 0;
::GetWindowThreadProcessId(hWnd, &pid);
if(pid == 0)
{
return TRUE;
}
//プロセスハンドル取得
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if(hProcess == 0)
{
return TRUE;
}
//プロセス内のモジュールのハンドルリストを取得
DWORD size = 0;
HMODULE hModule[1024];
if(::EnumProcessModules(hProcess, hModule, sizeof(hModule), &size) == 0)
{
return TRUE;
}
//モジュール名取得
int len = 0;
char path[MAX_PATH];
if(::GetModuleFileNameEx(hProcess, hModule[0], path, len) == 0)
{
::MessageBoxA(NULL, "GetModuleFileNameEx NG", "", MB_OK);
return TRUE;
}
::MessageBoxA(NULL, path, "", MB_OK);
//モジュール(又はEXEのPATH)とDLLのPAYHを比較する。
return TRUE;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
::GetModuleFileName(hModule, g_mName, MAX_PATH);
::EnumWindows(EnumWindowsProc, NULL);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return(TRUE);
}
