- 締切済み
ウィンドウメッセージについて
Visual C++ で初歩のプログラミングをさせていただいてますが、 実現できない点があるのでご回答いただけると幸いです。 環境は以下になります。 SDK: Visual C++ 6.0 OS: Windows XP 今やっているのは、他のウィンドウの動きを監視するというものです。 対象のウィンドウがリサイズされたら、サイズがいくつに変更されたかメッセージボックスを出します。 以下の手順でプログラミングしました。 MSG msg; RECT r; HWND hWnd = FindWindow("Notepad", "無題 - メモ帳"); if(hWnd != NULL) { return 0; } while( GetMessage(&msg, hWnd, 0, 0) ) { if(msg.message == WM_SIZE) { GetClientRect(hWnd, &r) ... } } このように書くと、コンパイルも通ったのですが、 リサイズどころかウィンドウを動かすこともできなくなってしまいました。 こういうのって力技でしょうか・・・。 フリーソフトなどでも多いですが、ウィンドウを監視するプログラム のコアな部分はどのように書かれているものなのでしょう? よい例があればご教授よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★おはようございます。 ・こういう場合は『フック』関数を使います。 ・API 関数としては SetWindowsHookEx、UnhookWindowsHookEx を使います。 また、DLL(ダイナミック・リンク・ライブラリ)が作れる知識も必要になります。 もし、DLL を作ったことがない場合は、先にこちらの知識(技術)を身につける 必要がありますよ。フック部分のルーチン(処理)は DLL でしか作れませんから。 簡単な方法: ・タイマー割り込み(WM_TIMER)でウインドウの状態(サイズ・最小化・最大化など)を チェック(監視)すればそこそこなツールは出来ます。でも、この方法は『力技』ですね。 ・フリーソフトでも『フック』を使わずにタイマーで処理しているものがあります。 自分のスキルと相談して実現方法を検討して下さい。最初はタイマー処理でちょっとした ツールを作ってみるのも面白いでしょう。→実感がわかないとステップアップする意欲 が出ませんから…。頑張って下さい。 最後に: ・フリーソフトで『ウィンドウを監視するプログラム』はフック関数を使っています。 フリーソフトにもよりますが、ちゃんと監視するには DLL を作って『フック』させます。 ・検索キーワード『フック関数』でいろいろ情報を引き出せます。試してみて下さい。 ・以上。おわり。→この質問は、DLL とフックがキーポイントとなります。 ※『GetMessage』の注意点は回答者 No.1 さんのアドバイスどおりですね。注意! 参考文献: ・http://www.kumei.ne.jp/c_lang/sdk2/sdk_160.htm→『第160章 メッセージフックの基礎』 ・http://ruffnex.oc.to/kenji/text/api_hook/→『Windows API Hooking Tutorial』
- t_nojiri
- ベストアンサー率28% (595/2071)
デバッグすれば分かると思いますが、http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getmessage.asp の警告の通り。 GetMessage 関数は、0 以外の値、0、-1 のいずれかを返します。 なので-1が返り続けると、無限ループです。