>確かwin32bitアプリから64bitアプリに対してGetModuleFileNameExなどは使えなかったと
>思ったのですがwin10だと動きますね。
試しに32bitのアプリに対して使ってみると、見事取得ができました。
>win8.1ではQueryFullProcessImageNameが使えます。
おっしゃる通り、リンク先のモジュールを使うとできました!
一応、できたものを置いておきます。
// モジュール
;http://hsp.tv/play/pforum.php?mode=pastwch&num=65277#65323
#module
#uselib "user32.dll"
#cfunc GetWindowThreadProcessID "GetWindowThreadProcessId" sptr, sptr
#uselib "kernel32.dll"
#cfunc OpenProcess "OpenProcess" sptr, sptr, sptr
#func CloseHandle "CloseHandle" sptr
#func QueryFullProcessImageName "QueryFullProcessImageNameA" sptr,sptr,sptr,sptr
#deffunc GetProcessName int _hwnd_, var pName
dim ret
sdim pName, 256
sdim FilePath, 1024
thID = GetWindowThreadProcessId(_hwnd_, varptr(PId)); // ウィンドウハンドルからプロセスID取得
hProcess = OpenProcess(0x001F0FFF, 1, PId); // プロセスIDからプロセスハンドル取得
if hProcess != 0 {
size=1024
QueryFullProcessImageName hProcess, 0, varptr(FilePath), varptr(size); // フルパス取得
len = stat; // 戻り値
if len = 0 : ret = -1;
} else {
ret = -2
}
CloseHandle hProcess; // プロセスハンドルを閉じる
pName = FilePath
if ret:pname=""+ret
return ret
#global
// メモ帳の実行ファイルのフルパスを取得するサンプル
#uselib "user32.dll"
#cfunc global FindWindow "FindWindowA" sptr,sptr
exec "C:\\Windows\\Sysnative\\notepad.exe" // 64bitメモ帳を起動
sdim pName, 256
wh = FindWindow("Notepad",0) // ウィンドウハンドル取得
GetProcessName wh , pName // フルパス取得
redraw 0
color : boxf
color 255,255,255
pos 0,0 : mes pName
redraw 1
gsel 0,2
stop
// おまけ:マウスカーソル直下のウィンドウの実行ファイルのフルパスを取得するサンプル
;http://hsp.tv/play/pforum.php?mode=pastwch&num=65277#65307
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
#cfunc GetAncestor "GetAncestor" int,int
#define GA_ROOT 2
sdim pName, 256
repeat
GetProcessName GetAncestor(WindowFromPoint(ginfo_mx,ginfo_my),GA_ROOT) , pName
redraw 0
color : boxf
color 255,255,255
pos 0,0 : mes pName
redraw 1
await 100
loop
stop
ところでQueryFullProcessImageNameは環境依存などあるのでしょうか?