特にテーマは無く雑記かな。 最近は自分用メモが増えてきましたけど。
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


HSP2.61の小技その5というか移植
2006年05月06日 (土) | 編集 |
今回は、ウィンドウハンドルからモジュール名(.exe名)を取得したいと思います。

具体的には、ここでやっている事をHSPで実装してみました。
ウィンドウハンドルから .EXE 名を取得するには?

今回は具体的なスクリプトを提示する程度の説明です。説明する程に分かっていないので。
とりあえず、すぐ使えるようにモジュール化してありますが、ウィンドウハンドルというのが分からないと使うのは厳しいかもしれません。
それから、Windows9x系の場合にはToolHelp32を使う必要があるのですが、私の環境ではフルパスを取得できなく(パス情報の無いファイル名のみとなる)、よく分からないので、今回はWindowsNT系のみの対応です。ToolHelp32を使用した方法にも対応したので、Windows9x系でも使用できます。ただしWindowsNT系ではPSAPI.DLLが必要です。ToolHelp32を試したのはWindowsMeなので、その他は分かりませんが。

それでは具体的なスクリプトです。今回は2つに分けています。
; "getfilename.as" ウィンドウハンドルからモジュールのフルパスを取得
; Copyright(C) 2006 Waterfowl, all right reserved.

;    GetFileNameFromHwnd hWnd,szFileName,nSize
;        hwnd:調べるウィンドウのハンドル
;        spFileName:モジュールのフルパスを受け取る文字列型変数
;        nSize:取得する文字列の最大の長さ
;        stat:正常にフルパスが取得できたら1,それ以外は0が代入される

;    予めllmod.asをインクルードしておく必要があります
;    WindowsNT系では使用するにはPSAPI.DLLが必要です

;    参考
;    ウィンドウハンドルから .EXE 名を取得するには?
;    http://techtips.belution.com/ja/vc/0022/

#module
;#define TRUE $00000001
;#define FALSE $00000000
;#define VER_PLATFORM_WIN32_NT $00000002
;#define VER_PLATFORM_WIN32_WINDOWS $00000001
;#define PROCESS_QUERY_INFORMATION $00000400
;#define PROCESS_VM_READ $00000010
;#define TH32CS_SNAPPROCESS $00000002
#deffunc GetFileNameFromHwnd int,val,int
    mref hWnd,0:mref szFileName,25:mref nSize,2:mref stt,64
    dim bResult,1:bResult=$00000000
    dim dwProcessId,1
    dim lpdwProcessId,1:getptr lpdwProcessId,dwProcessId
    dim prm,2:prm=hWnd,lpdwProcessId
    dllproc "GetWindowThreadProcessId",prm,2,D_USER
    dim osverinfo,37:osverinfo.0=148
    dim lposverinfo,1:getptr lposverinfo,osverinfo
    dim prm,1:prm=lposverinfo
    dllproc "GetVersionExA",prm,1,D_KERNEL
    if dllret@{
        if osverinfo.4==$00000002{
            ll_libload hDll_PSAPI,"PSAPI.DLL"
            if hDll_PSAPI{
                dim hProcess,1
                dim prm,3:prm=$00000400|$00000010,$00000000,dwProcessId
                dllproc "OpenProcess",prm,3,D_KERNEL:hProcess=dllret@
                if hProcess{
                    dim hModule,1:dim dwNeed,1
                    dim lphModule,1:getptr lphModule,hModule
                    dim lpdwNeed,1:getptr lpdwNeed,dwNeed
                    dim prm,4:prm=hProcess,lphModule,4,lpdwNeed
                    dllproc "EnumProcessModules",prm,4,hDll_PSAPI
                    if dllret@{
                        dim lpszFileName,1:getptr lpszFileName,szFileName
                        dim prm,4:prm=hProcess,hModule,lpszFileName,nSize
                        dllproc "GetModuleFileNameExA",prm,4,hDll_PSAPI
                        if dllret@{
                            bResult=$00000001
                        }
                    }
                    dim prm,1:prm=hProcess
                    dllproc "CloseHandle",prm,1,D_KERNEL
                }
                ll_libfree hDll_PSAPI
            }
        }
        if osverinfo.4==$00000001{
            dim hSnapshot,1
            dim prm,2:prm=$00000002,0
            dllproc "CreateToolhelp32Snapshot",prm,2,D_KERNEL:hSnapshot=dllret@
            if hSnapshot!=-1{
                dim pe,74:pe.0=296
                dim lppe,1:getptr lppe,pe
                dim prm,2:prm=hSnapshot,lppe
                dllproc "Process32First",prm,2,D_KERNEL
                if dllret@{
                    repeat -1
                        if pe.2==dwProcessId{
                            dim lpszFileName,1:getptr lpszFileName,szFileName
                            dim prm,2:prm=lpszFileName,lppe+36
                            dllproc "lstrcpy",prm,2,D_KERNEL
                            bResult=$00000001
                            break
                        }
                        dim prm,2:prm=hSnapshot,lppe
                        dllproc "Process32Next",prm,2,D_KERNEL
                        if dllret@==0{
                            break
                        }
                    loop
                }
                dim prm,1:prm=hSnapshot
                dllproc "CloseHandle",prm,1,D_KERNEL
            }
        }
    }
    stt=bResult
    return
#global
; "sample.as" GetFileNameFromHwnd使用例

#include "llmod.as"
#include "getfilename.as"
#define MAX_PATH 256

    sdim sfilename,MAX_PATH
    sdim stitle,16:stitle="フルパス"
    screen 0,480,120,0:gsel 0,2
    mes "選択したウィンドウのフルパスを取得します"
    mes "ウィンドウをクリックして下さい"

*lmainloop
    wait 1
    getkey ikey,1
    if ikey{
        prm=0:dllproc "GetForegroundWindow",prm,0,D_USER
        GetFileNameFromHwnd dllret@,sfilename,MAX_PATH
        if dllret@{
            mref bmscr,67:prm=bmscr.13,0,0,0
            getptr prm.1,sfilename:getptr prm.2,stitle
            dllproc "MessageBoxA",prm,4,D_USER
        }
    }
    goto lmainloop
1つ目のスクリプト全体をコピー&ペーストして保存し、それをインクルードすれば、"GetFileNameFromHwnd"という命令が使えるようになります。
このスクリプトをWindowsNT系で使うにはPSAPI.DLLが必要です。このファイルは次からダウンロードできるようです。
Microsoft Download Center - 再配布可能版のPSAPI.dll
Windowsの環境によっては、インストールされていない場合があるので、添付すると安全だと思います。

ToolHelp32が使える事を確認できたら、Windows9x系にも対応させて、こっそりこの記事を更新しているかもしれません。WindowsMeで確認したので、2006/05/07に更新しました。

ふかふかにこのような事が出来ると教えたら、実装の仕方を訊かれたので書いてみました。
どこまで需要があるのか分かりませんが、どうぞ。
スポンサーサイト

コメント
この記事へのコメント
いや。まぁ、自己解決したけどね。
2006/05/07(日) 04:21:37 | URL | hukahuka #NW1t8m6U[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
りなえちゃんはピュッピュッしたことある??
2006/09/22(金) 02:29:16 | りなえちゃん大丈夫?
熟した女の魅力がわかってこそ本物の男だと思う
2006/09/22(金) 02:29:16 | ダメになっちゃたよぉ…
付き合っているっていうのも、肩書きだけで、キスすらしたことありませんでした。
2006/09/22(金) 02:29:20 | この前の見ましたか?
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。