HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0502
ゆうやんウィンドウハンドルからウィンドウIDに変換するモジュール(その2)4解決


ゆうやん

リンク

2020/5/2(Sat) 20:38:16|NO.90274

ウィンドウハンドルからウィンドウIDに変換するモジュールです。
http://hsp.tv/play/pforum.php?mode=pastwch&num=79662 を少し改良してみました。

#module ConvertToWindowID #uselib "user32.dll" #cfunc IsWindow "IsWindow" int #cfunc GetWindowLong "GetWindowLongA" int,int #func GetWindowThreadProcessId "GetWindowThreadProcessId" int, var #define GWL_USERDATA -21 #deffunc GetHwndToProcessID OwnThreadId=GetWindowThreadProcessId(hwnd,OwnProcessId) return #defcfunc IsOwnWindow int ownhwnd GetWindowThreadProcessId ownhwnd,ProcessId if ProcessId=OwnProcessId:bool=1:else:bool=0 return bool #defcfunc HwndToWinID int hwndID if IsWindow(hwndID)=0:return -1 if IsOwnWindow(hwndID)=1{ WinIDHwnd=GetWindowLong(hwndID,GWL_USERDATA) }else{ WinIDHwnd=-1 } return WinIDHwnd #defcfunc WinIDToHwnd int WinID WinsID=ginfo(3) gsel WinID HwndID=hwnd gsel WinsID return HwndID #global GetHwndToProcessID;←最初に実行する #packopt hide 1 #uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int screen 0,400,240 screen 100,400,240,4 screen 150,400,240,4 gsel 0,1 repeat cls ;マウスカーソルがどのウィンドウIDに当たっているか調べる。自ウィンドウではない場合、-1が返る mes HwndToWinID(WindowFromPoint(ginfo_mx,ginfo_my)) wait 100 loop



この記事に返信する


Uum

リンク

2020/5/2(Sat) 21:35:15|NO.90275

失礼ですが、これテストしてますか?
>>GetHwndToProcessID;←最初に実行する
最初からエラーでます。
screenのIDが100とか150とか…?
????????????



あらや

リンク

2020/5/2(Sat) 22:05:56|NO.90276

>GetHwndToProcessID;←最初に実行する

エディタから実行する場合これを最初にやると
HSPのウィンドウでは無く、エディタのプロセスIDを記録してしまう事があります。

screen等の後にGetHwndToProcessIDとする方が安定して記録できます。



ゆうやん

リンク

2020/5/4(Mon) 10:58:54|NO.90286

実行ファイルを作成し起動してみましたが、エラーが出たり、エディタのウィンドウが記録されることはありませんでした。



ゆうやん

リンク

2020/5/6(Wed) 22:26:41|NO.90298

一応、オブジェクトも取得できるように改良してみました。
子ウィンドウは非対応です。

#module ConvertToWindowID #uselib "user32.dll" #cfunc GetParent "GetParent" int #cfunc IsWindow "IsWindow" int #cfunc GetWindowLong "GetWindowLongA" int,int #func GetWindowThreadProcessId "GetWindowThreadProcessId" int, var #define GWL_USERDATA -21 #deffunc GetHwndToProcessID;自ウィンドウの取得する関数 OwnThreadId=GetWindowThreadProcessId(hwnd,OwnProcessId);自ウィンドウかどうか調べる return #defcfunc IsOwnWindow int ownhwnd;自ウィンドウかどうか判別する。 GetWindowThreadProcessId ownhwnd,ProcessId if ProcessId=OwnProcessId:bool=1:else:bool=0 return bool #defcfunc HwndToWinID int hwndID;ウィンドウハンドルからウィンドウIDに変換する関数 if IsWindow(hwndID)=0:return -1 if IsOwnWindow(hwndID)=1{ objecthwnd=GetParent(hwndID);ウィンドウ内のオブジェクトを取得 if objecthwnd!0{ WinIDHwnd=GetWindowLong(objecthwnd,GWL_USERDATA);オブジェクトの親ウィンドウハンドルを取得しウィンドウIDを取得する return WinIDHwnd } WinIDHwnd=GetWindowLong(hwndID,GWL_USERDATA);ウィンドウハンドルからウィンドウIDを取得する }else{ WinIDHwnd=-1;自ウィンドウではない場合、-1を返す } return WinIDHwnd #defcfunc WinIDToHwnd int WinID;ウィンドウIDからウィンドウハンドルに変換する関数 WinsID=ginfo(3) gsel WinID HwndID=hwnd gsel WinsID return HwndID #global GetHwndToProcessID;←最初に実行する(ウィンドウIDからウィンドウハンドルに変換する場合は不要) #packopt hide 1 #uselib "user32.dll" #cfunc WindowFromPoint "WindowFromPoint" int,int screen 0,400,240 screen 100,400,240,4 button gosub "Button",*dummy screen 150,400,240,4 gsel 0,1 repeat cls ;マウスカーソルがどのウィンドウIDに当たっているか調べる。自ウィンドウではない場合、-1が返る mes HwndToWinID(WindowFromPoint(ginfo_mx,ginfo_my)) wait 100 loop *dummy return



ONION software Copyright 1997-2023(c) All rights reserved.