他のウィンドウのテキストの取得

2015 08/25
 プログラムをしていると 一番初期の頃から ウィンドウのテキストを変える SetWindowText テキストを取得する GetWindowText 等の API はかなり頻繁に 使用します。 良く考えれば SetWindowText GetWindowText 共に変な API で 両方とも 自分と同じプロセスで動いている( 同じメモリー 空間 ) ウィンドウに使用出来るのは当たり前として 自分と違うプロセス空間 で 違うメモリー空間で動いているウィンドウに 対しても 何の違和感もなく 相手に 自分のメモリー位置を指定して 読ませる 書いてもらう と言う動作をしています。
 まあ 此等は Windows 本来の持っている機能だから OS としての ウィンドウズが宜しくやってくれると言えばそんな物などでしょうが それならば SendMessage( hWnd, WM_SETTEXT, 0, (lParam)pszText ); や SendMessage( hWnd, WM_GETTEXT, 96, (lParam)pszText ); 等はどうなの やはり 同じプロセス 別のプロセス どちらも使用出来ます。 OS としての Windows 内部で宜しくやってくれているのは 間違いはありませんが SetWindowText GetWindowText とは全く同じではありません。SetWindowText GetWindowText はハングアップした ウィンドウに使用してもすぐに帰りますが WM_SETTEXT WM_GETTEXT は ハングアップした物に使用すると一蓮托生になってしまいます。 又 細かな事を言うと GetWindowText と WM_GETTEXT も違い WM_GETTEXT の方が取得出来る範囲が多いようです。
 例とすれば まだ GetMenuString と言う API も有ります。此も やはり 同じプロセス 別のプロセス どちらも使用出来ます。 メニューと言うのは あちらのプロセス こちらのプロセス ではないのかよ。と思いますが 此もウィンドウズが宜しくしてくれて いるようです。ウィンドウハンドル も メニューハンドル も同一システムの中では唯一無二の物らしいので内部で調整してくれて いるのでしょう。
 全部が全部此の様に OS としての Windows が宜しくやってくれる訳ではなく プロセスの独立性を考えれば通常はプロセスをまたいで 同じデータは共有出来ないと考えるのが妥当だろうと思います。この一番良い例だと思うのが 良くプロセス間通信に使用される WM_COPYDATA が有ります。ただ SendMessage で送らなければならず 結構 送る方も 送られる方も制限付きで 明らかに OS としての Windows が大きく関与しています。最大の欠点は 送られる方も 此の WM_COPYDATA message に準備対応していなければ役に立たず 送る方 送られる方 共に専用コードを持たないと使えません。結局 自分の書いたプログラム内でしか使用出来ません。
 ここからが やっと本題なのですが 自分が書いたプログラムではない物にどうしても此の内容を読んで此処に返して欲しいと言う リクエストをするにはどうすれば良いのでしょうか。Windows 95 98 ME と Windows NT 2000 と続く NT 系とは若干仕様が違い Windows 95 98 ME では プロセス間 共通メモリー としての FileMapping MapView と言う概念で行う事で 同一 マップ HANDLE で 誰でも 読み書き出来る 同じ所のメモリーを OS としてのWindows が用意してくれました。此によって マップ HANDLE のどこから 読んで 何処に結果を返してね とやり取りが出来る事になり GetWinTxt も此の方法でプログラムされていました。
此が Windows NT 2000 と続く NT 系 では 共通メモリーの概念は無くなり MapView は使用出来なくなり プロセスの独立性が高まりました。 その代わり VirtualAllocEx と言う 指定されたプロセスの仮想アドレス空間内のメモリ領域の予約とコミット をするAPI が新設され ました。此で確保した メモリー空間は 相手のプロセスの空間ですから 相手は何の制限もなく読み書き出来ます。それでこちらからは WriteProcessMemory ReadProcessMemory と言う API で 書き込み 読み込みを 行います。( 実際には データバッファを転送する形に なるのですが。) 此の様にして 通常では 読み込み 書き込みの出来ない所へデータの やり取りする事になります。
 GetWinTx も ClipSaver.dll も 上記の様な方法で 通常では取得出来ない相手の保持しているテキストを相手のコントロール ウィンドウにバッファに書いてもらい その後 此を取得しているので 普通に SetWindowText GetWindowText 等をしている物とは 違う API を使い 動作をしていますから ビールス検知ソフトから見れば 怪しい動作で 相手のメモリー空間に メモリーブロックを 作り それに書き込んだり 読んだりしている訳で マルウェアーと間違えられても致し方ないのかなとは思います。
もし 使用する時に 何らかのセキュリティーソフト等に刎ねられる様な時に 何もせずに除外リストに入れるのが不安なら GetWinTx.exe は 8Kb ClipSaver.dll は 10Kb しかないプログラムですから サイズを確認して除外リストに入れるのが 良いと思います。
-チップスに戻る- -トップページに戻る-