|
会社で使っているソフトに ファンクションバー というのがあります。 ファンクションバーの表示状態を確認したいのですが、ファンクションバーはカスタマイズ可能なので、できれば画像判定以外で確認したいと思ったのですが、行き詰まってしまいました。
とりあえず getid(get_frompoint_obj) でIDを取得して st_title と st_class を確認したところタイトルは無しで、クラスはBCGPControlBar:40000000:8:10003:10でしたので、これでIDを取得してst_visibleで確認しようかと思いまして、
getid("","BCGPControlBar:40000000:8:10003:10")を試しましたが-1が返ってくるので見つからないのだと思います。 (まあ本来ウィンドウのIDを返す関数らしいので、当然なのでしょうが)
なにか良い手段がありましたらご教授お願いします。
|
No.1195 2021/02/17(Wed) 14:03:57
|
☆ Re: オブジェクトの状態取得 / Rayna |
|
|
|
>>1195 あかは さん 子ウインドウを獲得する場合は GetCtlHnd か GetAllWinの子ウインドウ列挙 を使います 親ウインドウIDが取れてれば獲得できるはず...
うまく行かない場合は GET_FROMPOINT_OBJ で得たIDの ST_PARENT を 辿っていくとどれが親かわかりやすいです
//| 追記(2021/02/18) |////////// // 上げるほどのことでもないので追記 // GetCtlHnd の戻値ですが割と組込関数でなんとかなっちゃいます
Dim idWnd = GetId(GET_ACTIVE_WIN) // = GetId([Window Title], [Window Class]) While idWnd=GetId(GET_ACTIVE_WIN) Sleep(0.1) WEnd idWnd = GetId(GET_ACTIVE_WIN) Dim idWndCtl = HndToId(GetCtlHnd(idWnd, "BCGPControlBar:40000000:8:10003:10")) IfB GetId(GET_ACTIVE_WIN)=idWnd Then IfB Status(idWndCtl, ST_VISIBLE)=TRUE Then Print GetWinNameStrs(idWndCtl)+" は表示状態" ElseIf Status(idWnd, ST_ISID)=FALSE Then Print "親が獲得できてないか閉じられている" ElseIf Status(idWndCtl, ST_ISID)=FALSE Then Print "子が獲得できてないか閉じられている" Else Print GetWinNameStrs(idWndCtl)+" は非表示状態" EndIf EndIf Print
PutChildWindowTree(idWnd) // ウインドウ親子関係一覧出力 While Status(GetId(GET_LOGPRINT_WIN),ST_VISIBLE);Sleep(0.7);WEnd Procedure PutChildWindowTree(idWnd, nIndent=0) Dim idWndCtl, sIndent=Format(" ", (nIndent+1)*2) If nIndent=0 Then Print GetWinNameStrs(idWnd)+" の子ウインドウ一覧" For idWndCtl In GetAllWin(idWnd) If Status(idWndCtl, ST_PARENT)<>idWnd Then Continue Print sIndent+GetWinNameStrs(idWndCtl) PutChildWindowTree(idWndCtl, nIndent+1) Next FEnd Function GetWinNameStrs(idWnd) RESULT = "[<#DBL>"+Status(idWnd,ST_TITLE)+"<#DBL>, <#DBL>"+Status(idWnd,ST_CLASS)+"<#DBL>]" RESULT = Replace(RESULT, "<#CR>", "<CR>") // Editコントロールとかでテキストが ST_TITLE になってるの対策 FEnd
|
No.1197 2021/02/17(Wed) 16:01:07
|
|
☆ Re: オブジェクトの状態取得 / しろまさ |
|
|
|
// GetCtlHnd例(VncViewer例 要変更)
//ウィンドウIDの取得 id_W = GetID("New TightVNC Connection", "#32770", 0.2) hndW = GetCtlHND(id_W, "Button", 2) // hndW = GetCtlHND(id_W, "BCGPControlBar:40000000:8:10003:10", 1)
//objClass[ Button ]の取得と設定 o_Text = objText(hndW) // 取得 o_Text= "&Connect" MsgBox(o_Text) objText(hndW, "asd") // 設定 // objText(hndW, "asd", TRUE) // 設定(入力確認付)
Function objText(hndW, a_SetText = NULL, a_ChkText = FALSE) Result = "" Dim Buff = Format(ChrB(0), $FF), tBuff Ifb a_SetText <> NULL SendMessageA(hndW, WM_SETTEXT, 0, a_SetText) Ifb a_ChkText Repeat tBuff = Buff SendMessageA(hndW, WM_GETTEXT, $FF, tBuff) Until Trim(tBuff) = a_SetText EndIf Else If SendMessageA(hndW, WM_GETTEXT, $FF, Buff) > 0 Then Result = Trim(Buff) EndIf FEnd DEF_DLL SendMessageA(HWND, UINT, LONG, var PCHAR) :LONG :user32.DLL Const WM_SETTEXT = $000C Const WM_GETTEXT = $000D
|
No.1198 2021/02/17(Wed) 16:57:14
|
|
☆ Re: オブジェクトの状態取得 / あかは |
|
|
|
みなさんありがとうございます。
ウィンドウにくっついているオブジェクトも、ウィンドウという扱いで良いのですね。 とりあえず getallwin()で子ウィンドウを数えたところ、60もあるので >>1196 を参考に
wID = getid(,"Afx") for cID in getallwin(wID) if pos("BCGPControlBar",status(cID, st_class)) then print "★★★★" print "cID("+ cID + ") = " + status(cID, st_class) print status(cID, st_visible) print "X= " + status(cID, st_clx) + ", Y= " + status(cID, ST_CLY) print "W= " + status(cID, st_clwidth) + ", H= " + status(cID, st_clheight) + "<#CR>" next
とスクリプトを書いて実行したところ、表示状態の違いで
★★★★ cID(37)= BCGPControlBar:40000000:8:10003:10 True X= 0, Y= 1033 W= 1920, H= 22
★★★★ cID(19)= BCGPControlBar:40000000:8:10003:10 False X= 0, Y= 24 W= 318, H= 223
とそれぞれ確認できました。
親ウィンドウの st_title は 業務毎に異なり、st_class は Afx〇〇(〇〇は変動する)でかつ、別の作業で立ち上げているウインドウもクラスが Afx〇〇(しかもそれぞれのウィンドウにファンクションバーがあり、表示状態が異なる) なので、一意の値での特定が困難なのですが、アクティブウィンドウを対象にする事でなんとかできそうです。(お茶を濁すとも言う)
|
No.1201 2021/02/18(Thu) 11:59:48
|
|