tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルフォームでキーイベントを受取る
記事No11047
投稿日: 2013/02/05(Tue) 16:47
投稿者佐藤hs
大変お世話になります。お聞きしたいのですが。
下の様にしましたが、F1キーは認識されますが、CTRLキーが認識されません。何故でしょうか?

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' フォームでもキーイベントを受け取る
        Me.KeyPreview = True
    End Sub
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyData = Keys.ControlKey Then
            MsgBox("Controlキーが押されました。")
        End If
        If e.KeyData = Keys.F1 Then
            MsgBox("F1キーが押されました。")
        End If
    End Sub

[ツリー表示へ]
タイトルRe: フォームでキーイベントを受取る
記事No11048
投稿日: 2013/02/05(Tue) 17:40
投稿者Hongliang
Debug.Printでe.KeyDataを出力してみたりして、どんな値が来ている(あるいはそもそも来ていない)のか確認してみましょう。

結論から言うと、Ctrlキーは修飾キーとしてのCtrlキーと普通のキーとしてのCtrlキーの入力が存在しており、Ctrlキーの単独入力であってもこの修飾キーと普通のキーの組み合わせとしてイベントが来ます。
KeyDataプロパティは、修飾キーと普通のキーの組み合わせの値を格納するので、ControlKeyとの比較はFalseになります。

・e.KeyCodeプロパティは修飾キーを除いた値を格納するので、これとKeys.ControlKeyを比較し、ついでに他の修飾キーが入力されていないかe.Shiftやe.Altも参照したりする。
・(Keys.ControlKey And Keys.Control) と比較する。
などが思いつきます。

[ツリー表示へ]
タイトルRe^2: フォームでキーイベントを受取る
記事No11055
投稿日: 2013/02/06(Wed) 08:35
投稿者佐藤hs
Hongliangさんご回答大変有り難う御座いました。

結果以下の様になりました。
1)If e.KeyData = 131089 Then → ok
2)If e.KeyData = (Keys.ControlKey Or Keys.Control) Then → ok

3)If e.KeyData = (Keys.ControlKey And Keys.Control) Then → ng
4)If e.KeyData = Keys.Control Then → ng
5)If e.KeyData = Keys.ControlKey Then → ng

e.KeyDataには、131089が入ってくることがわかりましたので、1)で
解決しましたが、他もやってみたところ、上記の様になりました。
結果は理解できてませんが、ご報告まで

[ツリー表示へ]
タイトルRe^3: フォームでキーイベントを受取る
記事No11056
投稿日: 2013/02/06(Wed) 10:16
投稿者VBレスキュー(花ちゃん)
> 3)If e.KeyData = (Keys.ControlKey And Keys.Control) Then → ng
> 4)If e.KeyData = Keys.Control Then → ng
> 5)If e.KeyData = Keys.ControlKey Then → ng

KeyData ではなく KeyCode の方でも比較できます。

 If e.KeyCode = Keys.ControlKey Then

[ツリー表示へ]
タイトルRe^4: フォームでキーイベントを受取る
記事No11057
投稿日: 2013/02/06(Wed) 10:32
投稿者佐藤hs
花ちゃんさん
馬鹿な事を確認したかもしれませんが、以下の様になりました。
どうも有り難う御座いました。

1)If e.KeyData = 131089 Then → ok
2)If e.KeyData = (Keys.ControlKey Or Keys.Control) Then → ng
3)If e.KeyData = (Keys.ControlKey And Keys.Control) Then → ng
4)If e.KeyData = Keys.Control Then → ng
5)If e.KeyData = Keys.ControlKey Then → ok

[ツリー表示へ]
タイトルRe^5: フォームでキーイベントを受取る
記事No11058
投稿日: 2013/02/06(Wed) 12:07
投稿者VBレスキュー(花ちゃん)
> 馬鹿な事を確認したかもしれませんが、以下の様になりました。

私そのような回答しましたっけ?。

KeyData ではなく KeyCode の方でも比較できます。

 If e.KeyCode = Keys.ControlKey Then

だったはずですが。どこか日本語おかしかったですかね?<m(__)m>

本来は、KeyCode のヘルプ(MSDN)を見てほしかったのですが。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.keyeventargs.keycode.aspx
そこには Control キー 等と同時に押されているキーを取得するサンプル等が掲載されています。
   
    If e.KeyCode = Keys.F1 AndAlso (e.Alt OrElse e.Control OrElse e.Shift) Then
        ' Display a pop-up Help topic to assist the user.Help.ShowPopup(textBox1, "Enter your name.", New Point(textBox1.Bottom, textBox1.Right))
    ElseIf e.KeyCode = Keys.F2 AndAlso e.Modifiers = Keys.Alt Then


色々誤解を与えたお詫びに、私なりに試した結果を【サンプル投稿用掲示板】の方に
投稿しておきました。

  http://www.hanatyan.sakura.ne.jp/patio/read.cgi?no=332

[ツリー表示へ]
タイトルRe^6: フォームでキーイベントを受取る
記事No11059
投稿日: 2013/02/06(Wed) 19:07
投稿者魔界の仮面弁士
>       If e.KeyCode = Keys.A AndAlso (e.Alt OrElse e.Control OrElse e.Shift) Then
>          MsgBox("Controlキー と A キーが押されました。")
>       End If

このコードだと、Control(Ctrl) キーを押すことなく、 Alt + Shift + A を
押した場合にも、「Controlキー と A キーが押されました。」と
表示されてしまうような。

[ツリー表示へ]
タイトルRe^7: フォームでキーイベントを受取る
記事No11060
投稿日: 2013/02/06(Wed) 19:30
投稿者VBレスキュー(花ちゃん)
> このコードだと、Control(Ctrl) キーを押すことなく、 Alt + Shift + A を
> 押した場合にも、「Controlキー と A キーが押されました。」と
> 表示されてしまうような。

そのような突込みがあるかなと思いつつ、掲載されていたサンプルを書き換えずに
e.Control だけでなく e.Alt や e.Shift の取得できる事が解るようにと思い、そのまま
F1 キーの 部分を A にだけ変更して掲載しました。
ご指摘の部分は、理解して頂けると思い下記に、念のため、リンク先と Control キーの
取得方法を追加した次第です。

後程、色んなケースでの取得方法をサンプル投稿用掲示板の方にでも投稿しておきます。

[ツリー表示へ]