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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0401
yanoeオブジェクトIDからオブジェクトの種類の取特する方法を教えて下さい6解決


yanoe

リンク

2020/4/1(Wed) 11:37:23|NO.89878

HSP初心者です。
オブジェクトIDからオブジェクトの種類を習得する方法はありますか?



この記事に返信する


kanamaru

リンク

2020/4/1(Wed) 12:09:10|NO.89880

できるかできないかで言えばできます。
ただし、windows限定ですが。
オブジェクトidからobjinfoを使ってウィンドウハンドルを取得
GetClassNameを使ってウィンドウクラス名を取得
で、大変なのがここからで、
クラス名がButonだったとします。
その時、buttonとchkboxがあります。
この場合、今度はウィンドウスタイルをGetWindowLongで取得する必要があります
クラス名がEditだったとします
その時、inputとmesboxがあります。
この場合、やはりウィンドウスタイルを取得する必要があります。
残りのオブジェクトはクラス名からの判断で出来ます。
ウィンドウスタイルが絡むとどうも苦手なので、
実際にプログラムを作るのは他の人に任せます。



こいる

リンク

2020/4/1(Wed) 15:04:23|NO.89885

きたないサンプルですが、良ければどうぞ。
一応、HSP標準命令で設置できるオブジェクトには対応しているはずです。

// オブジェクトIDからオブジェクトの種類を取得するサンプル #module #uselib "user32.dll" #func GetClassName "GetClassNameA" sptr,sptr,sptr #func GetWindowLong "GetWindowLongA" sptr,sptr ; p1 = オブジェクトのID ; p2 = オブジェクトの種類を代入する変数 ; p3 = 取得するクラス名の長さ #deffunc GetObjType int objId, var ClassName, int nMaxCount objHwnd = objinfo_hwnd(objId) // IDをハンドルに変換 // クラス名取得 sdim ClassName,nMaxCount GetClassName objHwnd,varptr(ClassName),nMaxCount // chkbox判定 if ClassName=="Button"{ ; スタイルに BS_AUTOCHECKBOX が含まれているなら chkbox GetWindowLong objHwnd,-16 if (stat & 0x00000003){ ClassName = "Chkbox" } } // mesbox input判定 if ClassName=="Edit"{ ; スタイルに ES_MULTILINE が含まれているなら mesbox GetWindowLong objHwnd,-16 if (stat & 0x0004){ ClassName = "mesbox" }else{ ClassName = "input" } } return #global title "オブジェクトIDからオブジェクトの種類を取得" color 0,0,255: boxf // オブジェクト設置 objsize ginfo_winx,25 ; button pos ,ginfo_cy+10 button "button",*hoge id_button = stat ; chkbox pos ,ginfo_cy+10 dim x chkbox "chkbox",x id_chkbox = stat ; input pos ,ginfo_cy+10 x = "input" input x id_input = stat ; mesbox pos ,ginfo_cy+10 x = "mesbox" mesbox x id_mesbox = stat ; combox pos ,ginfo_cy+10 dim x combox x,,"combox \ncombox" id_combox = stat ; listbox pos ,ginfo_cy+10 listbox x,0,"listbox" id_listbox = stat // 結果 sdim sClassN,256 color 255,255,255 repeat 6 GetObjType cnt, sClassN, 256 mes str(cnt)+":"+sClassN loop stop *hoge



あらや

リンク

2020/4/1(Wed) 15:44:14|NO.89886

だいぶ被りましたが、こいるさんと似たようなモジュールです。

オブジェクトの種類を表す数値が飛び飛びになっているのは
winobjを使って『ラジオボタン』や『トグル式ではないチェックボックス』等を
使った時のための拡張用です。

数値自体に深い意味は無いので適当に変更しても問題ありません。


// オブジェクト判別モジュール #module #define GWL_STYLE -16 #uselib "user32.dll" #cfunc GetWindowLong "GetWindowLongA" int, int #func GetClassName "GetClassNameA" int, var, int // オブジェクトIDからオブジェクトの種類を判別 #defcfunc GetObjKind int _id sdim clsname, 260; // クラス名用変数の初期化 style = 0; // ウィンドウスタイル用変数の初期化 GetClassName objinfo(_id, 2), clsname, 260; // クラス名取得 style = GetWindowLong(objinfo(_id, 2), GWL_STYLE); // スタイル取得 style -= 0x50000000; // 全オブジェクトに共通するスタイルは除外(WS_CHILDWINDOW | WS_VISIBLE) if( clsname == "Button" ) { // Buttonコントロール style &= 0xF; // 下位4ビットだけ取得 if( style == 0 ) { // プッシュボタン(BS_PUSHBUTTON) rc = 1; // button } else:if( style == 3 ) { // トグル式チェックボックス(BS_AUTOCHECKBOX) rc = 3; // chkbox } } else:if( clsname == "ComboBox" ) { // ComboBoxコントロール style &= 0x3; // 下位2ビットだけ取得 if( style == 3 ) { // ドロップダウンリストボックス(CBS_DROPDOWNLIST) rc = 13; // combox } } else:if( clsname == "Edit" ) { // Editコントロール if( style & 4 ) { // 複数行エディットコントロール(ES_MULTILINE) rc = 22; // mesbox } else { rc = 21; // input } } else:if( clsname == "ListBox" ) { // ListBoxコントロール rc = 31; // listbox } return rc; // オブジェクトの種類を示す数値からオブジェクト名を返す #defcfunc GetObjName int _kind sdim name, 260; // オブジェクト名用変数の初期化 if( _kind == 0 ) { name = "unknown"; // 不明なオブジェクト } else:if( _kind == 1 ) { name = "button"; } else:if( _kind == 3 ) { name = "chkbox"; } else:if( _kind == 13 ) { name = "combox"; } else:if( _kind == 21 ) { name = "input"; } else:if( _kind == 22 ) { name = "mesbox"; } else:if( _kind == 31 ) { name = "listbox"; } return name; #global // 以下サンプル objsize 100, 20; pos 0, 0; input inp, , , 50; obj_id = stat; obj_kind = GetObjKind(obj_id); obj_name = GetObjName(obj_kind); mes "オブジェクトの種類は "+obj_kind+" です。"; mes "オブジェクト名は "+obj_name+" です。"; stop;



yanoe

リンク

2020/4/1(Wed) 18:00:04|NO.89889

あらやさん、サンプルありがとうございます!
参考にさせていただきます!



yanoe

リンク

2020/4/1(Wed) 18:00:54|NO.89890

こいるさん、
サンプルありがとうございます😊
参考にさせていただきます



yanoe

リンク

2020/4/1(Wed) 18:02:31|NO.89892

こいるさんのサンプルで解決出来ました
ありがとうございます



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.89878への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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