No.2
- 回答日時:
コマンドボタンのプロパティに[Default]という項目があります。
(初期値はfalseになってます)
こいつをTrueにすればフォーム上での[Enter]押下をClickイベントが受け取ります。
ボタンに「影」が付きますからよく見てね。
反対にEscを押下した際にClickイベントを発生させるのは プロパティ[Cansel]。
要するに「はい」「いいえ」のようなフォームの場合に、どちらを「主」とするか、
のような設定方法です。
> 並んであるコマンドボタンにフォーカスを移動させたいのですが
アクセスキーを利用した方が簡単でしょう。
Alt+(指定の文字)でフォーカスが移動します。
やり方はCaptionに&(指定の文字)とするだけ。
実行(E) (←カッコ内のEには下線が付く)の場合なら
Captionに 実行(&E)と記述するだけでOK。
見栄えがしますよ!
No.3ベストアンサー
- 回答日時:
質問1.エンターを押すと、特定のコマンドボタンが押ささるプログラム
質問2.キーボードの矢印キーで、並んであるコマンドボタンにフォーカスを移動
まず最初に、、、
質問が二つ以上になる時は、別スレッドでお願いします。
質問2についてのサンプルです。
TabIndexを使用してフォーカスが順次移動するのは、知っての通りです。
VBの仕様を捻じ曲げなければなりません。ならばOSからVBに処理が渡る直前に、そのOSから届くイベントを処理しちゃいましょう。フックという方法を使用しました。これを使用すると、特定のイベントタイプを監視できます。
最初にコマンドボタンを25個、フォーム1に貼り付けます。
0,1,2,3,4
5,3,7,8,9
....
...
...24
といったようにコントロール配列にしてください。
下記のコードを貼り付け実行してください。
フォームのキャプションに注目すると
「フックしていません」
となっているはずです。[Enter]か[クリック]をすることにより
「フックしています」
になります。
その状態の時にカーソルを押すと、望みの結果が得られると思います。
-----Form1ここから-----
Option Explicit
Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Const WH_KEYBOARD = 2
Private Sub Command1_Click(Index As Integer)
'フック中でない時
If g_lngHook = 0 Then
'(キーボードからの入力を)フックする
g_lngHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID)
Me.Caption = "フック中です"
'フック中の時
Else
'フックを解除してあげる
Call UnhookWindowsHookEx(g_lngHook)
g_lngHook = 0
Me.Caption = "フックしていません"
End If
End Sub
Private Sub Command1_GotFocus(Index As Integer)
'現在のフォーカスを持つコマンドボタンのインデックスを得る
g_intIndex = Index
End Sub
Private Sub Form_Activate()
If Me.Tag = "これから起動する" Then
Command1(0).SetFocus
Me.Tag = ""
End If
End Sub
Private Sub Form_Load()
Me.Tag = "これから起動する"
Me.Caption = "フックしていません"
End Sub
Private Sub Form_Unload(Cancel As Integer)
'フックした状態で終了しようとした時、フックを解除する
If g_lngHook <> 0 Then
Call UnhookWindowsHookEx(g_lngHook)
End If
End Sub
-----Form1ここまで-----
-----標準モジュールここから-----
Option Explicit
Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public g_lngHook As Long 'フックプロシージャのハンドル
Public g_intIndex As Integer '現在のフォーカスを持つコマンドボタンのインデックス
Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static blnReEnter As Boolean 'キーイベント2重発生防止フラグ
Select Case wParam
'カーソルキーを押された時
Case vbKeyRight, vbKeyLeft, vbKeyUp, vbKeyDown
'キーイベント2重発生防止
If blnReEnter = False Then
blnReEnter = True
KeyboardProc = 1
Exit Function
End If
'カーソルによる処理分岐
With Form1
Select Case wParam
Case vbKeyRight
'カーソルが一番右列にある?
If (g_intIndex Mod 5) = 4 Then
.Command1(g_intIndex - 4).SetFocus
Else
.Command1(g_intIndex + 1).SetFocus
End If
Case vbKeyLeft
'カーソルが一番左列にある?
If (g_intIndex Mod 5) = 0 Then
.Command1(g_intIndex + 4).SetFocus
Else
.Command1(g_intIndex - 1).SetFocus
End If
Case vbKeyUp
'カーソルが一番上行にある?
If (g_intIndex < 5) Then
.Command1(g_intIndex + 20).SetFocus
Else
.Command1(g_intIndex - 5).SetFocus
End If
Case vbKeyDown
'カーソルが一番下行にある?
If (g_intIndex >= 20) Then
.Command1(g_intIndex - 20).SetFocus
Else
.Command1(g_intIndex + 5).SetFocus
End If
End Select
End With
KeyboardProc = 1
blnReEnter = False
'カーソルキー以外を押された時
Case Else
'何もしない
KeyboardProc = CallNextHookEx(g_lngHook, nCode, wParam, lParam)
Exit Function
End Select
End Function
-----標準モジュールここまで-----
・・・で、質問1の方は、これらを応用して、フラグを立てたらできるような気がします。
この回答へのお礼
お礼日時:2002/02/20 19:07
大変お礼が遅くなりました。申し訳ございません。
とても参考になりました。
ありがとうございました
これからも、何かありましたらよろしくお願いします
No.4
- 回答日時:
ふと思ったのですが、オリジナルの処理を求めるのならば、コマンドボタンにこだわらない方がいいかもしれないですね。
いっそのことピクチャボックスにしてしまっては?
EnterとClickと処理を分けたいのであれば、それが一番手っ取り早いような気がするのですが。。。
ピクチャボックスにコマンドボタンの絵を張っておいて、フォーカスを得た時や失った時も必要なのであれば、LostやGotフォーカスで、絵の差し替えをしてあげると、同じような動きになると思います。クリックも反応させたいのであれば、マウスのUpDownMoveで差し替えることになります。
それをユーザコントロールにしておいたら非常に便利だと思いますよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Android(アンドロイド) AQUOS sense6sの物理ボタン(アシスタントキー)に再生・一時停止を割り当てる方法 2 2022/08/09 00:37
- Visual Basic(VBA) VBA 登録ボタンを省略してエンターキーで作業 4 2022/07/09 22:29
- Windows 10 Windows10の再起動について 3 2022/09/21 21:30
- ノートパソコン windows11ノートPCのスリープモードからの復帰方法 2 2023/08/17 09:27
- マウス・キーボード キーボード設定で困っています。長文です。 2 2022/12/10 12:44
- ノートパソコン Windows10のノートパソコンをさっきまで使っていて、指紋がついてたからぱっぱっとティッシュでキ 6 2022/07/13 01:52
- その他(プログラミング・Web制作) com Port のスイッチ入力でクリックのマクロを実行したい 1 2022/09/02 17:25
- 教えて!goo 「いいね」ボタンのキャンセル 1 2023/08/12 11:31
- Facebook Facebook 上でいいねボタンを押されることが鬱陶しく、そもそもボタンを押せないようにする設定は 1 2022/05/19 10:46
- デスクトップパソコン MACのF1からF12までのキーをNECキーボードで操作できるようにする方法を教えてください。 2 2023/04/01 21:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
フォームの再読み込み
-
Access VBA でデータペーストを...
-
ユーザーフォームに別シートか...
-
セルをマクロのボタンにしたい。
-
.NET(VB)でボタンの連打を防止...
-
プロシージャからイベントをコ...
-
VBA(エクセル)で自動的にボタン...
-
F10ボタンでMsgboxを開くとwind...
-
他フォームのクリックイベント取得
-
エクセルVBAでユーザーフォーム...
-
オプションボタンによっての表...
-
Excel マクロ 閉じるボタン
-
動的に作成したボタンオブジェ...
-
ボタンの状態
-
button をクリックしてもへこま...
-
ボタンコントロールの改行(Win...
-
【vb2005】 動的に作成されたCo...
-
初歩の質問です。
-
[Excel VBA]コマンドボタンの入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
フォームの再読み込み
-
ユーザーフォームに別シートか...
-
VBA CommandButtonの文字ずれ
-
セルをマクロのボタンにしたい。
-
コマンドボタンやイメージにマ...
-
Excel VBA Application.caller...
-
VBAのボタンの位置が変わって困...
-
Access VBA でデータペーストを...
-
プロシージャからイベントをコ...
-
他のアプリケーションとの連携
-
閉じると「+」になり開くと「-...
-
C#で動的に作ったtextboxを消す。
-
ボタンをマウスで押し続けたと...
-
VBA でのボタンの移動について
-
ボタン
-
CommandButtonのCaptionを変化...
-
TextBoxでEnterキーを押すと、...
-
VB.net でトグルボタンを実現し...
おすすめ情報