コントロールキーを押しながらコマンドボタンを押した時と、単にコマンドボタンを押した時とで、処理を変えようかと考えています。
Application.OnKey "^{}", "ctrl"で、キーを捕まえようかと考えましたが。エラーになります。
で、質問ですが、1つは、Ctrlキー、Shiftキー、Altキーを単体で押したときに任意のプロシージャーを実行することってできますか?
2つ目は、任意のプロシージャーではなく、押されているかどうかの状態のみ調べる方法ってありますか?
どなたか、詳しい方教えて頂けないでしょうか?宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
こんにちは。
KenKen_SP です。ついでの余談ですが、、、
GetAsyncKeyState 関数はキーの同時押しをうまく判定できません。
[SHIFT]+[CONTROL]キーの同時押しなどを判定する必要があれば、
GetKeyboardState 関数を使います。
あとは NT 系の OS に限定されますが、SHIFT、CNTROL、ALT の左右
を判定することも可能です。
サンプルを見て下さい。今回のご質問にあわせてボタンクリック時
のキーの状態を表示させてますが、もちろん、任意のタイミングで
キーの状態を取得できますよ。
これらの API は KeyDown イベントなどが使えない(用意されてい
ない)場合、つまり今回のなどで用いることが
'// キーの同時押しを判定
Private Sub CommandButton1_Click()
Dim KeyState(255) As Byte
GetKeyboardState KeyState(0)
If CBool(KeyState(VK_SHIFT) And &H80) And _
CBool(KeyState(VK_CONTROL) And &H80) And _
CBool(KeyState(VK_MENU) And &H80) Then
MsgBox "[SHIFT]+[CONTROL]+[ALT]+[クリック]"
ElseIf CBool(KeyState(VK_SHIFT) And &H80) And _
CBool(KeyState(VK_MENU) And &H80) Then
MsgBox "[SHIFT]+[ALT]+[クリック]"
ElseIf CBool(KeyState(VK_SHIFT) And &H80) And _
CBool(KeyState(VK_CONTROL) And &H80) Then
MsgBox "[SHIFT]+[CONTROL]+[クリック]"
ElseIf CBool(KeyState(VK_CONTROL) And &H80) And _
CBool(KeyState(VK_MENU) And &H80) Then
MsgBox "[CONTROL]+[ALT]+[クリック]"
ElseIf CBool(KeyState(VK_SHIFT) And &H80) Then
MsgBox "[SHIFT]+[クリック]"
ElseIf CBool(KeyState(VK_CONTROL) And &H80) Then
MsgBox "[CONTROL]+[クリック]"
ElseIf CBool(KeyState(VK_MENU) And &H80) Then
MsgBox "[ALT]+[クリック]"
Else
MsgBox "[クリック]"
End If
End Sub
'// SHIFT、CTRL、ALT キーの左右を判定(NT系OSのみ)
Private Sub CommandButton2_Click()
Dim KeyState(255) As Byte
GetKeyboardState KeyState(0)
If CBool(KeyState(VK_LCONTROL) And &H80) Then
MsgBox "[左CTRL]+[クリック]"
ElseIf CBool(KeyState(VK_RCONTROL) And &H80) Then
MsgBox "[右CTRL]+[クリック]"
Else
MsgBox "[クリック]"
End If
End Sub
'【標準モジュール】----------------------------------------------------
'// Win32API キーボードの仮想キーの状態を取得する
Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
'// キーコード定数
Public Const VK_SHIFT = &H10 'Shift
Public Const VK_CONTROL = &H11 'Ctrl
Public Const VK_MENU = &H12 'Alt
Public Const VK_LSHIFT = &HA0 'NT系OS only 左Shift
Public Const VK_RSHIFT = &HA1 'NT系OS only 右Shift
Public Const VK_LCONTROL = &HA2 'NT系OS only 左Ctrl
Public Const VK_RCONTROL = &HA3 'NT系OS only 右Ctrl
いつもいつもいつも有難う御座います。
お礼が大変遅くなり申し訳ありませんでした。
単純にコピペするだけで実現できました。
いつもながらアッパレと感じました。ただただ、感服しております。Win32APIに関する本って最低でもVBの本になってしまうと思いますので、何度かご指導頂いた使い方と照らし合わせて自分でも使いこなせるように努力したいと思います。(参考に(無謀とは思いつつ)VisualBasicTips1000+ガリバー著ソシム出版を買いました)すると、GetAsyncKeyState 関数も、GetKeyboardState 関数も載っていました。しかし、使い方が解らないので取り合えず中を見てみようと、(VBを持っていないので!)拡張子(frx,vbp,bas,frm)をtxtに変えて中を見てみましたが、 さっぱり解りません。(期待したコードは見れませんでした。)まぁ自分的には、今後の課題とします。まだまだ、minaraiを脱することは出来そうにありません。今後とも宜しくお願い致します。本当に本当に有難う御座いました。
No.2
- 回答日時:
#1 の
> 簡易的には Key_Down イベントでキーコードを判定し、CTRLキーならモジュール
> レベルのフラグを立てる方法がありますが、確実ではありません。
をコーディングするとこんな感じ。API を使いません。ただし、クリックの事前に
CommandButton1 にフォーカスが無いと KeyDown イベントが発生しないので、
それで、「確実ではない」となりますね、、、
Private mblnFLAG As Boolean
Private Sub CommandButton1_Click()
If mblnFLAG Then
MsgBox "[CTRL]+[CLICK]"
Else
MsgBox "[CLICK]"
End If
End Sub
Private Sub CommandButton1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If Shift = 2 Then 'fmCtrlMask
mblnFLAG = True
End If
End Sub
Private Sub CommandButton1_KeyUp( _
ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
mblnFLAG = False
End Sub
No.1
- 回答日時:
こんにちは。
KenKen_SP です。簡易的には Key_Down イベントでキーコードを判定し、CTRLキーならモジュール
レベルのフラグを立てる方法がありますが、確実ではありません。
そこで、API を使ってキーの状態を調べます。こんな感じ。
Private Sub CommandButton1_Click()
'Win32API の GetAsyncKeyState に渡す vKey は VB定数があります
'ので、それを利用します
'vbKeyShift 0x10 Shift Key
'vbKeyControl 0x11 Ctrl Key
'vbKeyMenu 0x12 Alt Key
'GetAsyncKeyState関数の戻り値が 0 以外ならそのキーは押下状態
If GetAsyncKeyState(vbKeyControl) <> 0 Then
MsgBox "CTRLキーを押しながらクリックされましたよ"
End If
End Sub
'【標準モジュール】----------------------------------------------------
'// Win32API キーボードのキーが押されているかどうかを調べる
Declare Function GetAsyncKeyState Lib "user32.dll" _
(ByVal vKey As Long) As Long
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- デスクトップパソコン Windows11でスクショする方法がわかりません。 調べましたが、どうもWindowsキーがあるキ 8 2022/06/05 05:37
- その他(パソコン・周辺機器) PCの操作中に画面がフリーズしましたマウスを動かしても反応しないし「Ctrl」キーと「Alt」キーと 2 2022/04/17 10:09
- マウス・キーボード キーボード設定で困っています。長文です。 2 2022/12/10 12:44
- その他(コンピューター・テクノロジー) 画面がおかしい 3 2023/03/26 07:50
- その他(IT・Webサービス) Google日本語入力の操作方法 一度確定した後の訂正方法 1 2023/06/17 16:03
- Word(ワード) IMEパッドがショートカットキーで開かないのですが。。。 5 2023/06/11 09:23
- その他(IT・Webサービス) AutoHotKeyで、キーボードにマウスの右クリックを割り当てられる? 1 2023/03/30 00:23
- その他(プログラミング・Web制作) iMacのシェル内カーソル移動 1 2022/06/15 17:27
- Word(ワード) ワードに貼ってあるURLが開かなくて困っています. Ctrl」キーを押しながら右クリックしても全く開 4 2022/04/30 22:40
- Windows 10 Windows10の再起動について 3 2022/09/21 21:30
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
うちのカレーにはこれが入ってる!って食材ありますか?
カレーって同じルーから作っても、家庭によって入っているものや味が微妙に違っていて面白いですよね! 「我が家のカレーにはこれが入ってるよ!」 という食材や調味料はありますか?
-
VBA ダブルクリックしたときにctrlキーが押されているか知りたいのですが。
Visual Basic(VBA)
-
Ctrlキーを押しながらのダブルクリック
Visual Basic(VBA)
-
KEYPREVIEW=TRUEについて。意味が分かりません・・。
Visual Basic(VBA)
-
-
4
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
5
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
6
特定のキーを押すまでループさせるにはどうすればよいですか。
Visual Basic(VBA)
-
7
Ctrl + Cなど複数の入力キーの感知
Visual Basic(VBA)
-
8
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プラス(足す)キーはどうやっ...
-
キーボードがCtrlキーが押され...
-
Scroll Lockが勝手に有効になる...
-
プーリーのキーが外れない
-
メールアドレスの作成の際上バ...
-
Shiftキーの解除方法
-
Access2010 Enterで次テキスト...
-
(word) 文字列の上に線を引く方法
-
エクセルで複数行に散らばった...
-
パソコンの青い線枠が消えませ...
-
Windowsのパソコンの特定のキー...
-
バックスペースキーが突然聞か...
-
PgDn、PgUpの設定が急に変わっ...
-
Shiftキーのはめ方を教えてくだ...
-
exp(13.4)を関数電卓で計算する...
-
パワーポイントの他のプログラ...
-
PDF-XChange Viewer 全画面表示...
-
「(アクサングラーブ)キー」と...
-
エクセル TABキーの動きを...
-
VSCodeで上書きモードにならない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プラス(足す)キーはどうやっ...
-
キーボードがCtrlキーが押され...
-
「か」を数字で表すとどうなり...
-
メールアドレスの作成の際上バ...
-
「(アクサングラーブ)キー」と...
-
Scroll Lockが勝手に有効になる...
-
プーリーのキーが外れない
-
PgDn、PgUpの設定が急に変わっ...
-
VSCodeで上書きモードにならない
-
IMEパッドがショートカットキー...
-
(word) 文字列の上に線を引く方法
-
Shiftキーのはめ方を教えてくだ...
-
パソコンの青い線枠が消えませ...
-
PDF-XChange Viewer 全画面表示...
-
キーボードの上部にあるランプ...
-
Ctrlキー+HomeキーでセルA1へ移...
-
Access2010 Enterで次テキスト...
-
exp(13.4)を関数電卓で計算する...
-
エクセルで複数行に散らばった...
-
サイト画面等で、一瞬に一番下...
おすすめ情報