• ベストアンサー

VBで、非アクティブでも入力を受け取る

VBをやっている中学生です。 いま、ウインドウ上にキーボードのカタチをしたものを表示させ、ユーザーが押したキーに応じてそのどこかのキーの色が変わるというソフトを作成しようと思っています。 それにあたっていくつか質問があります。 1.VBでウインドウを常に最善面に表示する方法を教えてください 2.ウインドウがアクティブになってなくても、キーさえ押されればその入力を受け取る方法を教えてくださ い。 ちなみに、キーが押されている間だけ色をかえさせたいので  KeyDownと KeyUpを利用しようと思っています。 回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは 大変難しい問題がありまして、「投稿しようか」、「投稿しないか」考えているうちに、1週間経ってしまいました。 >1.VBでウインドウを常に最善面に表示する方法を教えてください 上記は、 Me.TopMost = Trueでウインドウを常に最善面に表示することができますが、問題は次 >2.ウインドウがアクティブ~~~~~受け取る方法を教えてください。 上記は、もしIEなどが起動中であった場合、IEがアクティブな場合は、「A}と打ち込んだ場合「A」の文字が検索ボックスに表示されてしまいます。 上記の解決さくとして、 1.自アプリが起動中は、自アプリのみアクティブにして、他のアプリケーションは非アクティブ状態を維持する。 2.自プリが非アクティブの場合は、他のアプリケーションと重複しないキーを指定して(修飾キー+キー)自アプリをアクティブにする方法です。 2.の方法でサンプルを掲載します。 ボタンを2個フォームに貼り付けてください。 #プログラムの実行 自アプリが非アクティブになった場合 #CONTROL+ALT+F7で自アプリがアクティブになります。 #キーボードの「A」を押すと、Button1が赤くなります。 #キーボードの「B」を押すと、Button1が青くなります。 Public Class Form1 ' ホットキーメッセージ Private Const WM_HOTKEY As Integer = &H312 ' 修飾キー Private Enum ModifierFlags As Integer ALT = &H1 CONTROL = &H2 CONTROL_ALT = CONTROL Or ALT End Enum ' 登録ID Private Const WM_USER As Integer = &H400 Private Const WM_MyHotkeyId1 As Integer = WM_USER + 1 Private Const WM_MyHotKeyId2 As Integer = WM_USER + 2 ' 登録修飾キー Private Const MyHotkeyModifier1 As ModifierFlags = ModifierFlags.CONTROL_ALT Private Const MyHotkeyModifier2 As ModifierFlags = ModifierFlags.CONTROL_ALT ' 登録キー Private Const MyHotkeyVirtualKey1 As Keys = Keys.F7 Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Integer, ByVal id As Integer, ByVal mf As Integer, ByVal vk As Integer) As Integer Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Integer, ByVal id As Integer) As Integer Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown Dim regSuccess1 As Integer = RegisterHotKey(Me.Handle.ToInt32, WM_MyHotkeyId1, MyHotkeyModifier1, MyHotkeyVirtualKey1) ''''''''''''''''''''''''' 'ここから Me.TopMost = True Button1.Text = "A" Button2.Text = "B" Button1.BackColor = Color.Blue Button2.BackColor = Color.Blue Me.KeyPreview = True 'ここまでに記入する ''''''''''''''''''''''''' End Sub 'KeyDownイベント Private Sub Form1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown If e.KeyCode = Keys.A Then Button1.BackColor = Color.Red ElseIf e.KeyCode = Keys.B Then Button2.BackColor = Color.Red End If End Sub 'KeyUpイベント Private Sub Form1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp If e.KeyCode = Keys.A Then Button1.BackColor = Color.Blue ElseIf e.KeyCode = Keys.B Then Button2.BackColor = Color.Blue End If End Sub Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Dim unregSuccess1 As Integer = UnregisterHotKey(Me.Handle.ToInt32, WM_MyHotkeyId1) ' Dim unregSuccess2 As Integer = UnregisterHotKey(Me.Handle.ToInt32, WM_MyHotKeyId2) End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) Select Case m.Msg Case WM_HOTKEY Select Case m.WParam.ToInt32 Case WM_MyHotkeyId1 If Me.WindowState = FormWindowState.Minimized Then Me.WindowState = FormWindowState.Normal End If Me.Activate() Case WM_MyHotKeyId2 End Select End Select MyBase.WndProc(m) End Sub End Class 中学生と言ってもかなり、難しいことも分かってたりしますね。 上記のようなことは、すでに知ってたかな~

AsaBon_711
質問者

お礼

待ってました!w 回答ありがとうございます! とりあえず解決いたしました! これからさらに改良の余地があればやっていきたいと思います! 本当にありがとうございました

関連するQ&A