[delphi-users:2781] ToolbarWindow32クラスのボタン状態取得

392 views
Skip to first unread message

ムネ

unread,
Oct 7, 2012, 8:09:09 AM10/7/12
to delphi...@freeml.com
たまにdelphi触っている山本と申します。

既成他アプリのToolbarWindow32クラスに追加実装されたボタンの状態を取得することは可能でしょうか。
下記の通りハンドル取得して、ToolbarWindow32クラス上のボタンを操作することは出来ました。
各ボタンが個別にハンドルを持っていない様で、マウスポジションにて操作しています。
しかしボタンの状態(TBSTATE_ENABLEDか、TBSTATE_INDETERMINATEなのか)を認識した上で操作したいと思います。
可能であれば方向性などご教授願います。
今試しているのはXP,D5環境です。

var h1, h2 : HWND;

procedure TForm1.Button1Click(Sender: TObject);
begin
  h1:=FindWindow(nil,'アプリ名');
h2:=FindWindowEx(h1,0,'ToolbarWindow32',nil);
SendMessage(h2,WM_LBUTTONDOWN,0,MakeLong(430,10));
SendMessage(h2,WM_LBUTTONUP,0,MakeLong(430,10));
end;



MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
今すぐ遊べる!本格ブロック崩し
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWCKm
------------------------------------------------------[freeml byGMO]--

ムネ

unread,
Oct 8, 2012, 12:00:26 AM10/8/12
to delphi...@freeml.com
自己レスです。

いろいろ調べて,下記メッセージで取得できるかと思ったのですが
SendMessage(h2,TB_ISBUTTONINDETERMINATE,19,0);

D5では TB_ISBUTTONINDETERMINATE が未定義となりコンパイル出来ません。
新しいバージョンでは使用出来るのでしょうか?

メッセージ番号を調べて、SendMessage中に指定すれば出来るのでしょうか。
これから調べてみます。



MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
アイテム満載のクレーンゲーム【クレーン夫人】
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWK0f
------------------------------------------------------[freeml byGMO]--

ムネ

unread,
Oct 8, 2012, 1:26:50 AM10/8/12
to delphi...@freeml.com
自己レス、その2です。

TB_ISBUTTONINDETERMINATE 番号を探す。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb787377%28v=vs.85%29.aspx

定義ファイルは Commctrl.h らしい。
http://www-user.tu-chemnitz.de/~heha/viewzip.cgi/messtech/sensokom.zip/include/COMMCTRL.H?auto=CPP

この中に TB_ISBUTTONINDETERMINATE は無いが
// wParam button ID, LOWORD(lResult) != 0 enabled
#define TB_ISBUTTONENABLED (WM_USER + 9)
とある。

const
TB_BUTTONCOUNT = WM_USER + 25;
TB_ISBUTTONENABLED = WM_USER + 9;
var
i : integer; l : Longint;

i:=5;
i:=SendMessage(hToolBarW,TB_BUTTONCOUNT,0,0);
では i=2 となります。
添付画面とは合ってないようです。
i=20ならさらに探ろうと思いますが、疑心暗鬼状態です。

l:=4;
SendMessage(hToolBarW,TB_ISBUTTONENABLED,1,l);
(1は変えながらいくつかのbuttonを試す)
では l=4 のまま変化しません。

何かしらアドバイスお願いします。



MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
学園生活でのときめく出会い☆
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWL0i
------------------------------------------------------[freeml byGMO]--
ToolbarWindow32クラス上のボタン.JPG

Fukushi

unread,
Oct 8, 2012, 1:30:45 AM10/8/12
to delphi...@freeml.com
山本さん、こんにちは。福士と申します。

> D5では TB_ISBUTTONINDETERMINATE が未定義となりコンパイル出来ません。
> 新しいバージョンでは使用出来るのでしょうか?

手元のDelphi 5でもCommctrl.pasに

const
TB_ISBUTTONINDETERMINATE = WM_USER + 13;

と定義されています。usesにCommctrlユニットを追加すればよいのでは
ないでしょうか?

---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
志士達を率いて熱き時代を駆け抜けろ!【幕末魂】
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWL2R
------------------------------------------------------[freeml byGMO]--

ムネ

unread,
Oct 8, 2012, 2:21:06 AM10/8/12
to delphi...@freeml.com
福士さん、ありがとうございます。

windows.pasを始め、いくらか探してみたのですがCommctrl.pasにたどり着けませんでした。
message番号定義については解決です。
先の i:=SendMessage(hToolBarW,TB_BUTTONCOUNT,0,0);
の戻り値も i=26 となり、セパレータとボタンを合わせると26なので
まずは納得しました。
ちなみに先の Commctrl.h では
#define TB_BUTTONCOUNT (WM_USER + 25)
Commctrl.pas では以下の通り、上とは異なります。参考までに。
TB_BUTTONCOUNT = WM_USER + 24;
TB_COMMANDTOINDEX = WM_USER + 25;

これから TB_ISBUTTONINDETERMINATE の方を調べてみます。



MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWMcv
------------------------------------------------------[freeml byGMO]--

ムネ

unread,
Oct 8, 2012, 3:56:20 AM10/8/12
to delphi...@freeml.com
自己レス、その3です。

先の通り、
iTBCount:=SendMessage(hToolBarW,TB_BUTTONCOUNT,0,0);
で iTBCount=26 となり、同じく先の画像の通り、ボタン20個、セパレータ6個で
正しく取得できている物と思っていますが、本当にいいのでしょうか。
(トリガタイプ、データ番号の場所は別windowとhandleを持っています。)

続いて試した
for i:=1 to iTBCount do begin
i:=SendMessage(hToolBarW,TB_GETSTATE,i,0);
i:=SendMessage(hToolBarW,TB_ISBUTTONENABLED,i,0);
i:=SendMessage(hToolBarW,TB_ISBUTTONINDETERMINATE,i,0);
end;
では、いずれも i=-1 となります。
これは取得失敗ですよね。

では、ここで疑わしいのは wParam かなとは思うものの
他に思いつきません。
アドバイスの程、宜しくお願い致します。




MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日豪華プレゼントキャンペーン開催中!くまポン
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWNlQ
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Oct 8, 2012, 5:11:18 AM10/8/12
to delphi...@freeml.com
【[delphi-users:2793] Re:ToolbarWindow32クラスのボタン状態取得】 へのレ
スです.

こんにちは.Mr.XRAYです.
苦労されているようですね.

>続いて試した
>for i:=1 to iTBCount do begin
> i:=SendMessage(hToolBarW,TB_GETSTATE,i,0);
> i:=SendMessage(hToolBarW,TB_ISBUTTONENABLED,i,0);
> i:=SendMessage(hToolBarW,TB_ISBUTTONINDETERMINATE,i,0);
>end;
>では、いずれも i=-1 となります。
>これは取得失敗ですよね。

実際にやったことがないのですが,
この TB_GETSTATE メッセージの WParam の値は,各ボタンのコマンド
ID であって,ボタンの番号ではないような気がします.
おそらく,TB_GETBUTTONメッセージなどで,ボタンの情報を取得する
必要があるのかも知れません.
間違っていたらゴメンなさい.

参考リンク
Toolbar Control Messages
http://msdn.microsoft.com/en-us/library/ff486063%28v=vs.85%29.aspx


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
いつでもどこでもメールチェック!freemlのスマートフォンアプリ
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWPqi
------------------------------------------------------[freeml byGMO]--

ムネ

unread,
Oct 8, 2012, 6:06:39 AM10/8/12
to delphi...@freeml.com
Mr.XRAYさん、ありがとうございます。

参考リンクで紹介頂いた所や、Mr.XRAYさんのHPも参考にさせて頂いております。

おっしゃるとおり、TBBUTTON構造体経由でアクセスしなくてはダメなのかと
薄々思いつつも、敷居が高く足踏みしております。
下記の idCommand を WParam として渡せばいいのでしょうか。
 
typedef struct _TBBUTTON {
int iBitmap; // ビットマップのインデックス
int idCommand; // コマンドID
BYTE fsState; // ボタンの状態
BYTE fsStyle; // ボタンのスタイル
BYTE bReserved[2] // 予約(= 0 )
DWORD_PTR dwData; // アプリケーション定義値
INT_PTR iString; // テキストのインデックス
} TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON;

頑張ってみますが、どなたかお助け頂けませんでしょうか。




MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日コツコツポイント貯めて電子マネーやギフト券に交換しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWQaa
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Oct 8, 2012, 10:33:14 AM10/8/12
to delphi...@freeml.com
【[delphi-users:2781] ToolbarWindow32クラスのボタン状態取得】 へのレスで
す.

こんにちは.Mr.XRAYです.
スレッドが切れてしまっているので,後での参照を考えて,
最初のメールにレスさせてください.

>おっしゃるとおり、TBBUTTON構造体経由でアクセスしなくてはダメなのかと

Delphi のバージョン.... 分かりませんが,

var
BtnInfo : TTBButton;

でTTBButton 構造体にアクセスできます.Delphi XEにはあります.

SendMessage(h2, TB_BOTTOM, i, LPARAM(共有メモリのポインタ));

それと気が付いたことですが,現在の私の知識範囲内ですが,

(1) 「既成他アプリ」とありますが,一般的には,他のアプリの情報取得
には共有メモリを介する必要がある.
(2) TTBButoon.idCommand の値は,アプリの開発者が設定していなければ
検出はできない.

そんな場合は, IAccessible インターフェイス等を利用することも考え
られます.手前味噌ですが,記事のリンクです.

[678_他のアプリの操作と IAccessible インターフェイス]
http://mrxray.on.coocan.jp/Delphi/plSamples/678_IAccessibleInterface.htm
#top

[679_他のアプリの操作とUI Automation 関係インターフェイス]
http://mrxray.on.coocan.jp/Delphi/plSamples/679_UIAutomation_Test.htm


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
Wポイントでますますおトク!賢くネットショッピングしよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWUc4
------------------------------------------------------[freeml byGMO]--

ムネ

unread,
Oct 8, 2012, 7:34:01 PM10/8/12
to delphi...@freeml.com
Mr.XRAYさん、ありがとうございます。

ご紹介頂いた[678 ・・・]、[679 ・・・]、そして[677 ・・・]あたりを拝見させて頂いております。が、内容が理解できずに脚が(手が)止まっています。

これまではXP、Delphi5で進めています。今日から会社でDelphi2007があります。
D5でも commctrl.pas に TTBButton 定義はありました。

ちょっとペースが落ちると思いますが、[678 ・・・]、[679 ・・・]、改めて熟読してまいります。



MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
大宇宙へいざ出撃!【ブラウザ銀河大戦】
http://ad.freeml.com/cgi-bin/sa.cgi?id=iWWHU
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages