• ベストアンサー

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

  • vbで[ctrl]+[tab]を認識させるにはどうしたらよいでしょうか?

    はじめまして、どうしてもうまくいきません。教えてくださいませ。 [ctrl]+[tab]キー入力を認識させるにはどうしたら良いでしょうか? 現在、VBでMDIフォームを使用してプログラムを作っております。 [ctrl]+[tab]キー入力を行なうと、子フォーム間でフォームの移動が起こってしまいます。CommandButton押下時にのみ、フォームの移動を行なうようにしたいので、 [ctrl]+[tab]キー入力を制御して実現させようとしているのですが、うまくいきません。 MSDNライブラリには、KeyUpとKeyDownのイベントで Tabキーの操作は発生しないと書いてありました。。。 何か方法がありましたらお教えいただけると助かります。 どうぞよろしくお願いします。

  • VB2008でPictureBoxをキーボードを使って動かしたい

    VBを始めたばかりの初心者です。 VB2008を使ってPictureBoxに取り込んだイラストをキーボードを使って自由に動かしたいと思っています。 今作ったものの問題点 1.現状、全く同時に→と↑のキーを押せば右上に動きます。  また、→キーを押してイラストが右に動いているときに、↑キーを押すと上に動きます。  これを右上に動くようにする方法が知りたいのです。 2.キーを押し続けてイラストを動かし続けようとすると、一回動いて止まってから動き続けるという風になってしまいます。  これを止まらずに動くようにしたいのです。 ちなみにこれ↓が今のソースコードです。 Public Class Form1 Private Sub form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Up Then PictureBox1.Top = PictureBox1.Top - 10 End If End Sub Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Down Then PictureBox1.Top = PictureBox1.Top + 10 End If End Sub Private Sub form1_KeyLeft(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Left Then PictureBox1.Left = PictureBox1.Left - 10 End If End Sub Private Sub form1_KeyRight(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Right Then PictureBox1.Left = PictureBox1.Left + 10 End If End Sub End Class これ↑を実行する場合は、デザインにPictureBoxを表示してください。PictureBoxに入れるイラストは適当なものを入れてください。 よろしくお願いします。

  • キーの入力をVBで受けたいんです。

    VBで簡単な業務支援をしたいと思っています。 VBのアプリケーションがアクティブになっていなくても(起動はしてる)、あるキーの入力を感知して、VBがアクティブになりイベントが動くような処理はできないでしょうか? できればVBでやりたいのですが、Windowsの機能やAPIを使ってでもかまいませんので方法がありましたら教えてください。

  • WM_KEYDOWNでPrtScを捕まえる方法??

    ごく普通のウィンドウプロシージャでキーの判別を行っています 下記のように条件(1)が WM_KEYUP の際には(2)、(3)ともに検出します LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYUP: ............ (1) switch(wp) { case VK_RETURN: { break; } ..... (2) case VK_SNAPSHOT: { break; } ..... (3) default: { break; } } break; } return; ところが条件(1)を WM_KEYDOWN に変更すると(2)の Enter は検出しますが、(3)の PrtSc を検出してくれません 質問1 なぜ PrtSc を WM_KEYDOWN では検出しないのですか? 質問2 WM_KEYUP WM_KEYDOWN のいずれか一方にしか反応しないキーはまだありますか? 質問3 どのようにしたら PrtSc の WM_KEYDOWN を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • VB2005 TextBoxの入力制限について

    はじめて質問させていただきます。 現在、VB2005を使ってプログラムを組んでいるのですが、半角カタカナだけをTextBoxに入力し、表示する方法がわかりません。 Private Sub TextBox6_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox6.KeyDown TextBox6.ImeMode = Windows.Forms.ImeMode.KatakanaHalf End Sub Private Sub TextBox6_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox6.KeyPress If (e.KeyChar < "ア"c Or e.KeyChar > "-"c) And e.KeyChar <> vbBack Then e.Handled = True End If End Sub ↑見にくいかもしれませんがコードです。 この方法ではだめなのでしょうか? 回答をお願いします

  • VBでの入力値制限について

    はじめまして。 VBのテキストボックスに値を入力していき、ある桁数になるとメッセージを表示する仕組みを作りたいと考えています。 例えばVBで用意したテキストボックスにキーボードで123と入力しキーボードの4を押した直後に「桁数は3桁までです。」というメッセージを表示したいのですがいい方法を教えていただけないでしょうか? 自分で以下のように作ってみたのですがこれだとキーボードで123と入力し次に4を入力した時にテキストボックスに4が表示されてからエラーが出ます。そうではなく4をテキストボックスに表示させずに4をおしたら以下のメッセージが出るようにしたいのです。 よろしくお願い致します。 Private Sub text1_Change() If Len(text1.Text) > 3 Then MsgBox "桁数は3桁までです。", vbOKOnly + vbInformation, "情報" End If End Sub

  • VB6.0 KeyDownイベントの対応

    VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。 Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか? Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 40 Then execsub001() End If End Sub Private Sub Commnad10_Click() execsub001() End Sub Private Sub Comman10_GotFocus() 上記問題への対応策を此処に記述したい End If Private Sub execsub110() 内容は省略 End Sub

  • VB2008のGridDataView

    VB2008のGridDataViewについて質問があります。 詳しい方教えてください。 1)マウスでクリックしたり、キーボードの矢印キーでセルを移動すると そのカレントセルの行番号と列番号を空いているフォームに表示させたいです。 2)セルごとに背景色や字の色、フォントなど変えられるのでしょうか? 3)4行目の2列目にデータをセットしたり、取得する方法。 4)GridDataViewのバグや、陥りやすい点など。 よろしくお願いします。

  • SSTABでのKEYDOWNイベント

    VB6・SP5で開発を行っています。 FormのKEYDOWNイベントでPageUp・PageDownの押下の際に、 SSTAB上のアクティブなTABをずらす処理を行おうとしています。 問題はSSTAB上にフォーカスが移った直後だけ、 KEYDOWNイベントが2回実行されてしまうというものです。 KEYUPについても同様でした。 このような現象をご存知の方、 対処方法をお教えくださる方がいらっしゃいましたらよろしくお願いします。 ちなみにモジュール変数等のフラグはなるべく使用したくありません。

  • 【VB.NET】テキストボックスでENTERを押したときに出る警告音を止めたい。

    Multilineを許可していない状態のテキストボックスでENTERを押すと改行出来ないから警告音がでるのは分かるのですが、KeyUpやKeyDownイベントをENTERキーで発生させたい為どうしても警告音が出てほしくないのですが警告音を出さないようにする方法ってないでしょうか? よろしくお願いします。

専門家に質問してみよう