マウスクリックによるウィンドウアクティブ化を無視する
<アクティブにならないアプリケーション>
以前掲示板で質問があったものです。
宣 言 |
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal PWF&,
ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) As Long |
処 理 の 流 れ |
1、プログラム開始時にウィンドウプロシージャを自作のものにおきかえる
↓
2、送られたメッセージがWM_MOUSEACTIVATEならウィンドウプロシージャの戻り値を設定し抜ける
↓
3、送られたメッセージがWM_MOUSEACTIVATE以外ならばVB側にも処理を行わせるため(これがないと全てのイベントが発生しなくなる)、元のウィンドウプロシージャにメッセージを送る
↓
4、プログラム終了時にウィンドウプロシージャを自作のものから元に戻す。
サ ン プ ル プ ロ グ ラ ム |
まずフォームモジュールと標準モジュールを追加し以下のコードを張り付けて実行してください。マウスクリックによりウィンドウはアクティブ化しないはずです。
動作確認:Visual Basic 5.0(Visual Basic 4.0では動作しません(AddressOfを使用)),Windows98
フォームモジュール(Form1) |
Option Explicit Private Sub Form_Load() StartMsg End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) ExitMsg End Sub |
標準モジュール |
Option Explicit Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal PWF&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) As Long Public Const GWL_WNDPROC = (-4) Public Const WM_MOUSEACTIVATE = &H21 'マウスクリックによりアクティブウインドウが移った Dim oad As Long Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If uMsg = WM_MOUSEACTIVATE Then WindowProc = 3 Else WindowProc = CallWindowProc(oad, hWnd, uMsg, wParam, lParam) End If End Function Public Sub StartMsg() oad = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Sub ExitMsg() SetWindowLong Form1.hWnd, GWL_WNDPROC, oad End Sub |