ひとモノBLOG

10 « 2017 / 11 » 12
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
profile
SHOO
  • SHOO
  • 機械系の学生。の割にプログラミングとかのほうが得意だったり。
  • RSS
links
BLOG内検索
Adds by DTI Blog

ウィンドウハンドルから実行ファイル名を取得するプログラム
2008/04/16(水) [21:17:37]

ふと思い立って、ウィンドウハンドルから実行ファイル名を取得するプログラムを書いてみた。
実に適当な感じだが、とりあえず動くようなので、まぁよし。

簡単に言うと、
  1. ウィンドウハンドルからプロセスIDを取得
  2. プロセスIDからプロセスハンドルを取得
  3. GetWindowLongPtr(hWnd,GWL_HINSTANCE) てな感じに、モジュールハンドル取得
  4. GetModuleFileNameEx で実行ファイル名取得
といった感じなことをします。
具体的なコードは以下。
使った言語:D言語(D1.028)
使ったライブラリ:Tango 0.995, win32

import win32.windows;
import win32.psapi;
import Utf = tango.text.convert.Utf;
import tango.core.Memory;

char[] getModuleFileName(HANDLE hProcess, HMODULE hModule)
{
    scope psapi = LoadLibraryW("psapi.dll"w.ptr);
    if (psapi == null) throw new Exception("PSAPI.DLLが見つかりませんでした。");
    scope (exit) FreeLibrary(psapi);
    wchar[2048] fname_buf = void;
    wchar[] fname = fname_buf;
    auto funcGetModuleFileNameExW = cast(typeof(&GetModuleFileNameExW))
        GetProcAddress(psapi, "GetModuleFileNameExW");
    if (funcGetModuleFileNameExW is null)
        throw new Exception("GetModuleFileNameExWが見つかりませんでした。");
    uint len;
    while (1)
    {
        len = funcGetModuleFileNameExW(
                hProcess, hModule, fname.ptr, fname.length);
        if (len != 0 && len < fname.length) return Utf.toString(fname[0..len]);
        fname = (cast(wchar*) GC.malloc(len * wchar.sizeof))[0..len];
    }
    assert(0);
}

char[] getModuleFileNameByWindowHandle(HWND hWnd)
{
    DWORD dwPID;
    DWORD dwThreadID = GetWindowThreadProcessId( hWnd, &dwPID );
    scope hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwPID);
    if (hProcess is null)
        throw new Exception("プロセスが開けませんでした。");
    scope (exit) CloseHandle(hProcess);
    auto hMod = cast(win32.windows.HMODULE) GetWindowLongPtr(hWnd,GWL_HINSTANCE);
    return getModuleFileName(hProcess, hMod);
}
getModuleFileNameByWindowHandle に、ウィンドウハンドルを渡してやると実行ファイル名が得られる。


rel="prev"<<dmdでまとめてコンパイル | ホーム |

この記事に対するトラックバック

この記事のトラックバックURL

この記事に対するコメント

この記事にコメントする

管理者にだけ表示を許可する
| HOME |