いろきゅうのブログ

はてなダイアリーから移行中…

「Yahoo!知恵袋」の質問に答えちゃうのかしら!

Yahoo! 知恵袋にこんな質問がありました。

こちらのブログで見かけたような感じにメモ帳のダイアログを変更したいのですが、自分で作ることはできるでしょうか?

http://d.hatena.ne.jp/ir9/20090815

こちらのブログで見かけたような感じにメモ帳のダイアログを変更した... - Yahoo!知恵袋

ご回答するかしら!

以下難しい話

Windows の "MessageBox" が表示される瞬間を検知し、大元の MessageBox の表示をキャンセルしつつ*1、代わりに自前の吹き出しウィンドウ・ボタン&キャラクターを表示しています。 ちなみに "吹き出しウィンドウ" と "キャラクターウィンドウ" は別ウィンドウです。

で、どうするのよって話ですけども、

  1. 他人のプロセスへ自前のDLLを侵入させ、ウィンドウが作成される瞬間を監視する。
  2. ウィンドウ作成のメッセージが飛んできたら、そのウィンドウが "MessageBox()" が作ったモノなのかを確認する。
    • 別物だったら、何事もなかったかのように帰る。
    • そうだったら、ウィンドウに表示されている文字列をぶんどって、自前の吹き出しウィンドウでキャラクターが喋っているような感じで表示する。

まぁつまりは「ズルして楽して(他人のプロセスへ)侵入かしら! 」ってワケですネ。 :-]




ポイントとなりそうなのは

  • 他人のプロセスへ自前のDLLを注入する方法。
  • MessageBox によるウィンドウ表示であるかを確認する方法。
  • 非矩形のウィンドウの表示方法。
  • Visual Studio で 他プロセスへの Attach する方法。コレが出来ないとデバッグできない。

でしょうかね。



…とまぁ、あえて抽象的に書いたのは、他人のプロセスへ自分のDLLを注入した際、その注入したDLLにバグがあると、モノの見事に全てのプロセスが死んで行きますから非常にヤヴァイ状態になるんですね。「Windows プログラミングの仕組み」をある程度知ってからでないと結構ヤヴァイと。

なので、あえて使うべき関数とかは書いてません。 それを知ってる程度のスキル・検索能力がないと辛いよーというワケですね。(ちょっと申し訳ない感がありますけれども…


ちなみに、難しいってよりかは「簡単な問題がウジャウジャあって、ヤになってくる」ってのが正解な気もします…(ぉ

ついでに

何か「こんなのが欲しいー!」ってのがあれば、コメント欄に頂ければありがたしです。

あんな機能が欲しい! とか。 他のキャラクターで作って欲しい! とかとか。

更についでに

誰か、この回答エントリーのURLを知恵袋のアンサーに書いてもらえると嬉しいです。(ぉ(他人本力

*1:今の実装では大嘘:ぉ