« スクリーンキーボードを作る | トップページ | ボタンをマウスクリックでアクティブ化しない »

フォームをマウスクリックでアクティブ化しない

 スクリーンキーボードを実現するためには,まず,スクリーンキーボードをクリックしてもフォアグラウンドウィンドウが変わらないようにしなければなりません。そのためにスクリーンキーボードのフォームやボタンをマウスでクリックしてもそれがアクティブにならないようにする必要があります。

 Me.SetStyle(ControlStyles.Selectable, False)は効果がない。

 フォームのWndProcメソッドをオーバーライドしてWM_MOUSEACTIVATEに対してMA_NOACTIVATEを返す。(この場合タイトルバーをマウスクリックするとアクティブになる。またタイトルバーのボタンは有効。)

 MA_NOACTIVATEANDEATを返した場合にはタイトルバーやそのボタンも無効になる。(ボタンは機能しない。ウィンドウのドラッグもできない。)

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.TopMost = True
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_MOUSEACTIVATE = &H21
        Const MA_NOACTIVATE = 3
        Const MA_NOACTIVATEANDEAT = 4
        If m.Msg = WM_MOUSEACTIVATE Then
            m.Result = New IntPtr(MA_NOACTIVATE)
            Return
        End If
        MyBase.WndProc(m)
    End Sub

End Class

参考:WM_MOUSEACTIVATE

|

« スクリーンキーボードを作る | トップページ | ボタンをマウスクリックでアクティブ化しない »

コメント

クロスプラットフォームのVB.netアプリケーションを作りたいんだけど、このオーバーライドの方法はwindowsOSでしか使えないか教えて欲しい

投稿: HY | 2017年12月29日 (金) 19時19分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: フォームをマウスクリックでアクティブ化しない:

« スクリーンキーボードを作る | トップページ | ボタンをマウスクリックでアクティブ化しない »