HWND値からコモンコントロール種別を高速識別するには?

[戻る]
くたくた 2002/10/29(火) 19:05:33
HWND値からコモンコントロール種別を高速識別する方法を教えて頂けないでしょうか。
例えば、「HWND値が スピンコントロールか否か」を高速に判別したいのです。

現状、
(1) GetClassName()でウィンドウクラス名を取得
(2) 予めSpy++で調べておいた各コモンコントロールのウィンドウクラス名
    (スピンの場合は"msctls_updown32")と(1)を文字列照合
をしてます。が、コントロールの数が多いと とても時間がかかります。
そこで、もっと速く識別できる方法を探しています。

ご存知の方、どうか宜しくお願い致します。

環境:Win2K+SP3, VC++6.0+SP5 MFCベース, Pentium3

dairygoods 2002/10/30(水) 09:42:01
あらかじめ細工をしておくことが可能であれば、
コントロールIDから種類を判定できるようにしておくのはいかがでしょう?

くたくた 2002/10/30(水) 11:40:04
dairygoodsさん、回答ありがとうございます。

>あらかじめ細工をしておくことが可能であれば、
>コントロールIDから種類を判定できるようにしておくのはいかがでしょう?
とても残念ですが、それはできません。
コントロールIDではそのクライアントソフトでしか通用しないからです。
実は、ライブラリで使えるコードがを必要としております。
(この事を冒頭で提示すべきでした。失礼致しました)

とても短い関数ですが、使用頻度が高くいろんなクライアントソフトで使う為、
汎用性と高速性が必要なのです。

(回答頂いた方法は、クライアントソフト内だけで解決するにはとても有効ですね。
 ライブラリ化する前は私もそうしていました。)

今も考えている最中ですが、引き続き情報を頂けると幸いです。

dairygoods 2002/10/30(水) 13:01:11
GetClassLong(hwnd, GCW_ATOM);
でクラスを一意に識別する値が取れるようです。

どのPCでも同じ値になるのかは、ちょっと分かりません。
私の環境(Win2K)では、スピンのATOMは49222でした。

くたくた 2002/10/30(水) 15:44:17
dairygoodsさん、度々回答ありがとうございます。

>GetClassLong(hwnd, GCW_ATOM)でクラスを一意に識別する値が取れるようです。
>どのPCでも同じ値になるのかは、ちょっと分かりません。
>私の環境(Win2K)では、スピンのATOMは49222でした。
実験の結果、残念ながらこの方法も使えませんでした。実験の条件は下記の通りです。
o イントラネットで繋がっている2つのPC上で実験。双方ともWin2K+SP3,Pentium3
o ダイアログベースの実験ソフトを作り、初期状態のフォームに
  ボタン/ラジオボタン/スピン を1コづつ追加
o OnLButtonDown()内でGetDlgItem()->GetSafeHwnd()でATOM値を取得
o 他のソフト(ライブラリ等)は一切使わない

実験結果は下記の通りです。
o 何故か ボタン/ラジオボタン のATOM値が同値(49175)。
o スピンのATOM値は各々のPCで49222,49217に分かれた
o Debug/Release版とも同じ結果になった

以上です。もう少し考えてみます。

dairygoods 2002/10/30(水) 16:28:37
ライブラリの初期化時や初回の呼び出し時などに、
判定したいウィンドウクラスのATOMを調べて保持しておくことで対応できないでしょうか。

また、ボタン/ラジオボタン/チェックボックス/グループボックスは
リソースエディタではあたかも別物のように扱われていますが、
同じボタンクラスのスタイルが違うだけのものです。

くたくた 2002/10/30(水) 17:16:36
[[解決]]
>ライブラリの初期化時や初回の呼び出し時などに、
>判定したいウィンドウクラスのATOMを調べて保持しておくことで対応できないでしょうか。
私も 現時点ではこれがベストだと思いました。代替案が出るまでの間、この方法を使います。

>また、ボタン/ラジオボタン/チェックボックス/グループボックスは
>リソースエディタではあたかも別物のように扱われていますが、
>同じボタンクラスのスタイルが違うだけのものです。
これらをSpy++で調べたら確かに"Button"という同一のウィンドウクラス名でした。
(何故か、今までこれらの調査を忘れておりました)

dairygoodsさんには本当にお世話になりました。ありがとうございました。
深く感謝いたします。

古いスレッドには追加発言できません。