- 題名: ウィンドウがアクティブになるのを防ぎたい
- 日時: 2006/07/07 13:19:17
- ID: 16530
- この記事の返信元:
- (なし)
- この記事への返信:
- [16587] Re[1]: ウィンドウがアクティブになるのを防ぎたい2006/07/11 10:41:42
- ツリーを表示
その後Googleで色々探してやってみました。
メインフォームのウィンドウメッセージをオーバライドして、
WM_WINDOWPOSCHANGINGの時にアクティブにならないように処理すればいいのでは?と思って、
以下のように書いてやってみたのですがやはりアクティブになってしまいます。
アクティブになるのを防ぐのにWM_WINDOWPOSCHANGINGで処理をするので
あっているのでしょうか?
まだ解決できていないので引き続きよろしくお願いします。
' 定数の定義
Private Const HWND_TOPMOST As Integer = -1 ' 最全面に表示する
Private Const HWND_NOTOPMOST As Integer = -2 ' 最前面に表示するのをやめる
Private Const SWP_NOSIZE As Integer = &H1 ' サイズを変更しない
Private Const SWP_NOMOVE As Integer = &H2 ' 位置を変更しない
Private Const SWP_NOZODER As Integer = &H4 ' 現在のZオーダーを維持
Private Const SWP_NOACTIVATE As Integer = &H10
Private Const SWP_SHOWWINDOW As Integer = &H40
Private Const SWP_NOSENDCHANGING As Integer = &H400 'WM_WINDOWPOSCHANGINGを送らない
<Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As Integer, _
ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
End Function
Structure WINDOWPOS
Public hWnd As IntPtr 'ウィンドウのハンドル
Public WndInsertAfter As IntPtr 'ウィンドウのZオーダをこのメンバで指定したウィンドウの前に置く。または、定数。
Public x As Integer 'ウィンドウの左上隅のX座標
Public y As Integer '同、Y座標
Public cx As Integer 'ウィンドウの幅
Public cy As Integer '同、高さ
Public flags As Integer 'ウィンドウの位置と高さを指定するフラッグ
End Structure
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_WINDOWPOSCHANGING As Integer = &H46
Select Case m.Msg
Case WM_WINDOWPOSCHANGING
Dim wp As New WINDOWPOS
If m.LParam <> IntPtr.Zero Then
wp = DirectCast(m.GetLParam(GetType(WINDOWPOS)), WINDOWPOS)
SetWindowPos(wp.hWnd, HWND_NOTOPMOST, wp.x, wp.y, wp.cx, wp.cy, _
SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOSENDCHANGING)
Return
End If
End Select
MyBase.WndProc(m)
End Sub
分類:[.NET]