DOBON.NETプログラミング道掲示板
(現在 過去ログ4 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■34481 / inTopicNo.1)  KeyDownでの右コントロールキーイベント
  
□投稿者/ Kuroi 一般人(1回)-(2020/06/13(Sat) 12:24:52)
  • アイコン環境/言語:[VB.NET(2005)/Windows7 32bit→1064bit] 
    分類:[.NET] 

    これまでWindows7 32bitで動作していた社内アプリについて、Windows10 64bitで動作しないかと検証したところ、
    Form_KeyDownイベントでの右コントロール(Keys.RControlKey)が反応しないことがわかりました。
    これを何とか動かしたいと考えています。

    厳密には、過去にWindows8や10の64bitで検証したときも動かず、ただしその時に、コンパイラの
    CPUがAnyになっているため、x86にすれば直る、あるいはSDKに含まれるCorFlags.exeにて対応すれば動いていました。

    ところが時間が暫く経って、今になって同じことをしようとするも動かなくなりました。
    変わったことといえば、PCが新しくなって、.netFramework3.5が初期状態オフになってことぐらいしか思い浮かびません。

    (ソース変えずに動けばベストなのですが)
    そもそもを何とかしようと考えております。
    右コントロール(Keys.RControlKey)以外の、たとえばKeys.F1などとすればこれは反応しました。
    Keys.Zなども反応します。
    ただ、Keys.ControlKeyやKeys.ShiftKeyなどは同様に動作しませんでした。
    CtrlやShift(ALTも?)などのキーは特殊キーだということはググっていて何となくわかってきたのですが、
    右コントロールキーを使って、何とか代替手段などで進められる方法があればご教示願えないでしょうか。

引用返信 削除キー/
■34482 / inTopicNo.2)  Re[1]: KeyDownでの右コントロールキーイベント
□投稿者/ Hongliang 大御所(579回)-(2020/06/13(Sat) 14:19:31)
  • アイコン// ひょっとしたらキーボードやキーボードドライバによる影響もあるのかもしれませんが

    Keys列挙体はWindowsのVirtual Key, VKをそのまま転写したものです。
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardstate
    そして、ctrlキーのL/Rを区別するVK_LCONTROL/VK_RCONTROLは、
    > These left- and right-distinguishing constants are available to an application only through the GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey functions.
    とあるように、非常に限定されたAPIでのみ有効な値になっています。
    Control.KeyDownイベントはWM_KEYDOWNメッセージのラッパであり、ここでは単純にWM_KEYDOWNのWPARAMをKeysとして扱ってるだけなので、Windows/WinFormとしては、KeyDownイベントのKeyEventArgs.KeyDataでL/Rの区別はつけていないというのが仕様と考えられます。

    区別をつけたいのであれば、前述のVK_L*/VK_R*を使えると明言されているAPIを改めて呼び出す必要があるでしょう。
引用返信 削除キー/
■34483 / inTopicNo.3)  Re[2]: KeyDownでの右コントロールキーイベント
□投稿者/ Kuroi 一般人(3回)-(2020/06/14(Sun) 11:07:54)
  • アイコンHongliang様

    ありがとうございます。
    L/Rどころか、Shift、Control単体でもダメだったので、何かあるのかなと思っていました。

    その後、少し検証を進めたところ、たまたま次のようにしていて

    Case Keys.F1
     関数呼び出し()
    Case Keys.RControlKey
     関数呼び出し()

    やはり右コントロールはきかないのですが、一度、F1キーを入力した後はきくようになりました。
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -