円でエンエンエン
ポストメッセージでトゥもーローの巻き
ラジオにもなって絶好調の円でエンエンエン。今回はウィンドウズにまたたちもどり、メッセージ処理の基本にもならない実験を行った。
さて、メッセージ処理については方々で説明があるが中でも気に入ってるのが何語だかわけわかんない。この説明である。
WindowsAPIからWinMAinにdemarre programmme〜ときて。WindowsProcに対してはTransmet messages。各々情報をやりとりするさいにはprend le code binaire dans les dllである。
なんのこっちゃ。
図から察するに下にウインドウのかたちをした絵があるのでたぶんわれわれが作るウインドウズプログラムなんだろう。上がカーネルモード、あるいはリング0、宮部みゆきと呼ばれるミステリー領域のはずだ。なんとなくそういう気がする。
従来のプログラムの多くはOSの上にのっかり、OSが順番を決めて、その順番に従ってプログラムはユーザーインターフェイスを占有するのがつねだった。同時にプログラム(プロセス)は走ったとしても、ユーザーインターフェイスは占有するのがつねだった。
イベントドリブンとかマルチタスクといわれるものの醍醐味は、ユーザーインターフェイスんところまで平行して動くというところにあると思う。
つまり黄色と青の境界線がUI、緑いろの部分がプログラム(プロセス)、緑色のひとはわーっと青に押し寄せてくる。今までのプログラムが処理を行って返すというタチのプログラムだとすると、イベントドリブンは青のOSがUIなどからのイベントをもってくるまで処理を待つネコ。あるいは従来のものがSなら現在はMである。
ということで以上をふまえて早速暴走させてみよう。
パラ利パラリラパラ利ラリー
暴走して人は学び、大人になるのです。盗んだバイクではしご酒(By六弦斉)。
さきほどの変な外国語と私のわかりやすい図から、当然OSのどっかに、全ウィンドウプログラムのメッセージを管理するところがあるはずだと思い立つ。そして名前がGETとかSETとかPOKE PEEKとかいうパソコンサンデーで慣れ親しんだような機能を持つAPIがあるはずだと考える。そして最近の若者はそれを“たたく”というらしい。“たたく”?コラ鉄也!なんですかコラ。
ということで見つけたのがこれ、料理万歳
BOOL PostMessage(
HWND
hWnd, // ポスト先ウィンドウのハンドル
UINT
Msg, // メッセージ
WPARAM
wParam,
// メッセージの最初のパラメータ
LPARAM
lParam // メッセージの 2 番目のパラメータ
);
これでもってウインドウズのメッセージキューにメッセージを送り込むことが出来る、フフフフフフ
そして注釈がこれ
PostMessage 関数を使って WM_QUIT
メッセージをポストすることは避けてください。代わりに、PostQuitMessage
関数を使ってください。
WM_QUITはウインドウの終了メッセージだ。これをひとたびポストしてやれば、該当するウインドウはまるでライオンにかみつかれたインパラのようになることまちがいなしって比喩が不明瞭。
注釈にあるPostQuitMessageではウインドウハンドルを渡すことができないので、他人のウインドウハンドルに終了メッセージを送り込むことができない。
ということもふまえて、PostMessage関数を使ってWM_QUITを送り込むプログラムを作ってみよう。レッツビギン、恋しくて
こんなんでいいだろう
::PostMessage(
(HWND)0xxxxxx, // ポスト先ウィンドウのハンドル
WM_QUIT, // メッセージ
0,
// メッセージの最初のパラメータ
0 // メッセージの 2 番目のパラメータ
);
さて、相手のウインドウのハンドルを取得できないといけない。めんどうくさいのでSPYを使ってウインドウの番号を覗いてみよう。
先ほどたちあげておいたメモ帳のハンドルはB0C06であるようだ。
こちらもめんどうくさいので生がきする
::PostMessage(
(HWND)0xB0C06, // ポスト先ウィンドウのハンドル
WM_QUIT, // メッセージ
0,
// メッセージの最初のパラメータ
0 // メッセージの 2 番目のパラメータ
);
これをボタンにはっつけて、プログラム完成。早速メモ帳とプログラムを見てみよう。
押しマース
バキューン。
無事にメモ帳を強制終了させることができた。200くらいあるメッセージを駆使していけば、外部プログラムからメモ帳にアホと書くことだって可能だ。
ということで暴走成功
パラ利パラリラパラ利ラリー
また来週!