テンキー横のエンターキーをタブキーとして使うには?

タグの編集
投稿者 hori  (社会人) 投稿日時 2013/4/11 09:35:16
普通のキーボードには、エンターキーが
バックスペースの下とテンキーの横との2か所にあって同様の働きをしていますが
この2つを切り離して

中央のはテキスト入力時の変換や改行のため
テンキー横のはデータ入力の確定やフォーカス移動のため(タブキーと同様に)
と云う風に使いたいのです。

いろいろ当たってみましたが方法がわかりません。
もしくは、不可能なことなのかどうかもわかりません。
ご存知の方ございましたら、ご教示ください。よろしくお願いいたします。
投稿者 るきお  (社会人) 投稿日時 2013/4/11 21:32:06
>いろいろ当たってみましたが方法がわかりません。
>もしくは、不可能なことなのかどうかもわかりません。
可能ではありますが、Enterキーのような機能的なキーの機能を置き換えた場合、
考慮すべき事態を列挙するのが大変で、いろいろなシーンでつじつまが合うか心配です。
Enterキーのいろいろなシーン、考慮すべき事態の列挙、とは、たとえば、
・ボタンにフォーカスがあるときのクリックの発生有無。
・コンボボックスで同上
・メニューを展開しているとき。
・システムメニューを展開しているとき。
・ウィンドウをキー操作で移動しているとき。
などです。

また、キーボードのキーに本来の機能と違うことをさせるわけですから、
ユーザーの混乱もあります。

以上の理由から私はそのようなことをしないことをお勧めします。


技術的にはEnterキーが押された場合握りつぶして代わりにTabを送信するプログラムを書けば一応実現できているように動きます。
通常のEnterとテンキーのEnterはキーコードが同じなので普通は区別がつかず、多分lParamで区別できるのだと思うのですが、ちょっと調べたところ仕様が明記されているところが見つけられませんでした。
自分で試したところ25ビット目で区別しているようだったので、このプログラムではその方式で区別しています。ですから、うまく区別できない可能性もあります。

Public Class Form1

    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean

        Const WM_KEYDOWN As Integer = &H100

        If msg.Msg = WM_KEYDOWN Then
            
            If msg.WParam = Keys.Enter Then

                Dim bit25 As Integer = &H1000000
                Dim isTenkeyEnter As Boolean = CBool(msg.LParam.ToInt32 And bit25)

                If isTenkeyEnter Then
                    SendKeys.Send(vbTab)
                    Return True
                End If
                
            End If
        End If


        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function

End Class
投稿者 hori  (社会人) 投稿日時 2013/4/12 00:04:23
るきおさま。ありがとうございます。

感謝、感激、雨あられでございます。
マウスの無いパソコンに慣れ親しんだ世代にとっては
ここに『入力キー』が無いというのは悲しいことでした。
(ちなみに、エンターは『改行』です)

コードの中身はさっぱりちんぷんかんぷんですが
とりあえずプログラムに張り付けてみましたら
僕の希望通りに動いております。

自分でこれを書けるようになれるとは思えませんが
仮になれたとしても、その頃には
もう隠居しないといけない年頃になっておりましょうから
本当にありがたく存じます。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2013/5/12 16:25:25
> マウスの無いパソコンに慣れ親しんだ世代にとっては
自分もその世代です。当時はパソコンではなくマイコンと呼んでいましたけれどね。


> ここに『入力キー』が無いというのは悲しいことでした。
> (ちなみに、エンターは『改行』です)
あれ…英単語の意味からすれば、逆のような気が。
enter こそ「入力」キーではありませんでしたか?

入力値の確定がエンター、次に進むのがリターン。

エンターキー = Enter Key = 入力キー (= 実行キー)
リターンキー = Return Key = 改行キー = ⏎キー


Windows の世界では、ほとんどが Enter 表記で統一されていますが、
Mac の場合は、Enter と Return 両方のキーを装備していますね。

Mac ではメインキー側が return、テンキー側が enter。
http://www.dtp-transit.jp/images/apple-keyboards-US-JIS.jpg
キーの少ない MacBook などでは、[fn]+[return] で enter 扱い。


ちなみに、キーボードに刻印された ⏎ の文字は、リターン記号(Return Symbol)を表しています。
Unicode なら U+23CE、JISコードなら 1-7-94 の文字です。


> マウスの無いパソコンに慣れ親しんだ世代にとっては
汎用機/ワークステーションではなく、パソコンの話なのですよね。

初期のマイコン/パソコン(PC-8801、MSX、AppleII、FM-8、PASOPIAなど)では
ほとんどが RETURN 表記だったはずです。自分も RETURN 世代ですが。

ただし、IBM PC や PC/AT 互換機については ENTER 表記で、
それを受け継いだ現在の PC は、基本的に ENTER 表記ですね。

まぁ、メインキー側が「⏎/↵」、テンキー側が「⏎」なものや、
メインキー側が「ENTER/↵」、テンキー側が「ENTER」なものもあるので、
Windows の世界では、特に区別されてはいないのでしょうけれど。


ちなみに DirectX の世界では、DirectInput のキー識別コード表にて
メインキーの Enter は DIK_RETURN (0x1C)、
テンキーの Enter は DIK_NUMPADENTER (0x9C) で区別されます。