GetWindowLongとGetClassLongはどう違うの?


牛和歌丸  2007-09-17 13:53:17  No: 66374

VC6++, C+APIです。

ウィンドウに定義付けられたアイコンのハンドルを取得するときに、GetWindowLongではなくて、GetClassLong((HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), GCL_HICON) としたのですが・・・
このGetWindowLong と GetClassLong はどう違うんでしょうか?

どちらもウィンドウに関連付けられた情報を取得するという点で違いはないように見えるんですが、RegisterClassで登録された内容をGetClassLongで、CreateWindowで設定された内容をGetWindowLong で取得するという感じなんでしょうか?

ヘルプを参照しても、なんだが同じような説明でちょっとわかりにくかったので質問させていただきます。  よろしくお願いします。


wclrp ( 'o')  2007-09-17 19:57:11  No: 66375

確かあなたの考えであっている。


瀬戸っぷ  2007-09-17 20:05:37  No: 66376

RegisterClassで登録されたウィンドウクラスから、複数のウィンドウを作成することが出来ます。
(コンボボックスやボタン等、既存のコントロールが複数作れるように。)

で、書かれているようにGetClassLongでウィンドウクラスの情報は取れます。
が、作成した各ウィンドウハウィンドウハンドルで識別されるように別々ものとあります。
それぞれのウィンドウに個別にアイコンを設定した場合、ウィンドウクラスからでは取得できません。

ウィンドウクラスからの取得はひな形の情報を取得、
ウィンドウハンドルを使っての取得は実際のウィンドウからの取得…となります。
(ボタンコントロールのウィンドウテキストの取得で考えたら判りますかね?ウィンドウクラスにウィンドウテキストの情報はありませんが…)


牛和歌丸  2007-09-18 00:28:58  No: 66377

なるほど。
ではSetClassLong(hwnd, GCL_WNDPROC, newWndProc)とやると、たとえばこの第一引数のhwndにボタンコントロールのハンドルを指定すると、それ以降はボタンクラスに属するウィンドウ(=ボタンってことかな)からのメッセージをフェッチできるってことでしょうか?
逆にある特定のボタンをサブクラス化したい場合は、SetWindowLong(hwnd, GWL_WNDPROC, newWndProc)であたらしいウィンドウプロシージャを指定するってことかな・・
でもSetClassLongを使うと、他のアプリ(他プロセスで実行されてるプログラム)に属するコントロールまで一遍にサブクラス化できでしまいそうな気がするんですが、どうなんでしょう


wclrp ( 'o')  2007-09-18 02:22:09  No: 66378

>それ以降はボタンクラスに属するウィンドウ
そうだよ。

>特定のボタンをサブクラス化したい場合は
そうだよ。

>でもSetClassLongを使うと、他のアプリ
最近ウィンドウクラスを使ってのスーパークラス化やってない
からわからない。
// てか俺MFCつかうからむりか。

Windowsは徐々に他のプロセスとの独立性を高めてきている。
そもそも別プロセスのメモリや関数にアクセスできない。

もし別プロセスのウィンドウクラスを
自分のウィンドウプロシージャに変更出来てしまったら
ウィンドウプロシージャ呼び出した時点で
不正なメモリアクセスとかで落ちるね。

だからフックはDLL使い
DLLからうっかりEXEに直接アクセスして不正な処理になるんや。

上記は推測入ってます。
やってみたらどう?


wclrp ( 'o')  2007-09-18 02:30:11  No: 66379

うろ覚え

SetClassLongで変更した後に
ウィンドウを作成したものが変わるだとおもった。

関係しそうなの見つけた
http://support.microsoft.com/kb/32519/ja
でも意味わかんないや


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加