Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

Windowsメッセージキュー

Windowsメッセージ

Windowsメッセージキューに格納されたWindowsメッセージは、

作成されるタイミング

ウィンドウを作成したスレッドには、Windowsメッセージキューが与えられる。

通常、1UIスレッドで複数ウィンドウを処理する。この場合も1Windowsメッセージキューになる。

メッセージ・ループ

メッセージ・ループで使用するWin32PI

メッセージの取り出し

メッセージの割り当て

待機

その他

.NETでメッセージループ(WinProc?)を実装する方法

ウィンドウプロシージャ(WndProc?

WndProc?で使用するWin32PI

WndProc?登録

WndProc?のサブクラス化

WndProc?のサブクラス化とは、WndProc?の置き換えと、元のWndProc?へのチェーンを実装すること。
オブジェクト指向のサブクラスではないが、それ相当のことをやっている(オーバーライド+base呼び出し)。

メッセージの送信

ハードウェア入力

ハードウェア入力モデルとローカル入力状態

ハードウェア入力モデル

RITが接続するVIQのスレッドを識別する

THREADINFO構造体

ローカル入力状態(THREADINFO構造体内)

キーボード入力、ウィンドウフォーカス情報

マウスカーソル管理情報

マウスによる切り替え

Win32API

SetFocus?

GetFocus?

ローカル入力状態からフォーカスを持つウィンドウのHWNDを返す。   

SetActiveWindow?

GetActiveWindow?

ローカル入力状態からアクティブなウィンドウのHWNDを返す。   

BringWindowToTop?

HWND_TOPを指定しSetWindowPos?を呼び出す(RITに接続するVIQを変更可能)

SetWindowPos?

ウィンドウをアクティブにしてサイズ、位置、Zオーダの変更。(RITに接続するVIQを変更可能)   

SetForgroundWindow?

ウィンドウをフォアグラウンドに移動するが(RITに接続するVIQを変更可能)
プログラマによって乱用されたため、MSはRITに接続されているか、RITに接続されている
別スレッドが一定時間以上、入力を受け取っていない場合にのみ成功するように機能を追加した。

失敗の際は、タスクバーをフラッシュさせる。

AllowSetForgroundWindow?

指定したプロセスのスレッドがSetForgroundWindow?を呼び出すことを許可する。

LockSetForgroundWindow?

他のSetForgroundWindow?呼出をロックする(Windowsスタートメニューなどで使用されている)。 

GetForgroundWindow?

フォアグラウンドウィンドウのHWNDを返す。

GetKeyState?

最後のキー入力を返す。 入力フォーカスを持ったウィンドウを持ってる必要はない。   

GetAsyncKeyState?

キーが押されているか? 前回の呼び出し以降にキーが押されたか?を返す。 入力フォーカスを持ったウィンドウを持ていること。

SetCursor?

マウス・カーソルのセット(砂時計など)     ・ShowCursor?   マウス・カーソルの表示・非表示     ・ClipCursor?   マウス・カーソルの範囲を指定する。   (非同期的なアクティブ化イベントで中止)     ・SetCapture?   マウス・カーソルがウィンドウの   範囲内にあるかどうかに関わり無く、   すべてのマウス入力を受け取る。      一度に 1 つのウィンドウだけ   がマウスをキャプチャできる。      通常はマウスのボタン押下後に呼び出す。     ・ReleaseCapture?   上記のマウスのキャプチャを停止する。     ・AttachThreadInput?   複数のスレッドに複数のVIQと   ローカル入力状態を共有させる。      ただし、THREADINFO構造体の、   ・ポストメッセージ   ・送信メッセージキュー   ・応答メッセージキュー   ・ウェイクフラグ   については自分のものを使い続ける。      このAPIはシステムの強度   を損なう可能性がある。      用途としてはジャーナルの   記録・再生フックをインストールした場合。

  RE#2347:アプリケーションの切替方法について   http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_2302_2.html#Num2360-0

    AttachThreadInput? API関数で     無理やり現在アクティブなスレッドに     自分のスレッドをアタッチして、     その間にBringWindowToTop? API関数で     自分のフォームを前面に出します。        その後もう一度AttachThreadInputAPI関数     でデタッチして解除すれば可能です。     もちろん、Windowsの仕様に反しますが。

ユーザオブジェクト

ユーザオブジェクト(プロセスに占有)

参考


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS