マウスクリックによるウィンドウアクティブ化を無視する

<アクティブにならないアプリケーション>

以前掲示板で質問があったものです。

宣 言

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

トップに戻る
Visual Basicワンポイントテクニック目次に戻る

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル