
No.5ベストアンサー
- 回答日時:
サンプルを作ってみました。
必要なものは
フォーム1
コンボボックス1
標準モジュール
です。
処理を説明します。
サブクラス化という処理をしています。
VBにはクリックやボタンダウンなどのイベントがありますが、全てWIndowsが送ってくる定数(メッセージ)を読み取り、その値によってイベントの内容が決まります。このプログラムはコンボボックスにくるWINDOWSからのメッセージをcomboProc関数にて監視し(これがサブクラス化)、カーソルのイベントだけコンボボックスのリスト部分が非表示のときには、メッセージをWINDOWSに返さないようにしています。もしリスト部分が表示されていても、WM_COMMANDという決定というメッセージを返さないようにしています。
サブクラス化の最中に強制終了をすると、VBが落ちます。必ず普通にフォームを閉じて終了しましょう。
常にこの関数が動いている状態なので、プログラム作成最終段階での組み込みをお奨めします。それまでは、[サブクラス化の開始][サブクラス化の終了]部分をコメントにしておくだけで、このプログラムは動きませんので安心してください。
-----フォーム1(ここから)-----
Private Sub Form_Load()
With Me
'ダミーのデータ
With .Combo1
.AddItem 1
.AddItem 2
.AddItem 3
.AddItem 4
End With
'サブクラス化の開始
pLngProc = SetWindowLong(.Combo1.hwnd, GWL_WNDPROC, AddressOf comboProc)
End With
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
With Me
'サブクラス化の終了
Call SetWindowLong(.Combo1.hwnd, GWL_WNDPROC, pLngProc)
End With
End Sub
-----フォーム1(ここまで)-----
-----標準モジュール(ここから)-----
Option Explicit
Public Const GWL_WNDPROC As Long = (-4)
Private Const WM_COMMAND = &H111 'メニューが選択されたあるいはコントロールにイベントが発生した
Private Const WM_KEYDOWN = &H100 'キーボードのキーが押された
Private Const WM_KEYUP = &H101 'キーが解放された
Private Const CB_GETDROPPEDSTATE = &H157 'コンボボックスでリストボックス部が開いているかどうか調べる
Private Const CB_SHOWDROPDOWN = &H14F 'コンボボックスでドロップダウンリストを表示・非表示
Private Const KEY_UP As Byte = &H1
Private Const KEY_DOWN As Byte = &H2
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'プロセス
Public pLngProc As Long
'カーソル↑←を押されたとき、1バイト目にフラグを立てる
'カーソル↓→を押されたとき、2バイト目にフラグを立てる
Private bytKeyFlg As Byte
Public Function comboProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
'キーダウン
Case WM_KEYDOWN
'wParamにはキーコードが入る
Select Case wParam
'カーソル↑←
Case vbKeyUp, vbKeyLeft
'1バイト目にフラグを立てる
bytKeyFlg = bytKeyFlg Or KEY_UP
'カーソル↓→
Case vbKeyDown, vbKeyRight
'2バイト目にフラグを立てる
bytKeyFlg = bytKeyFlg Or KEY_DOWN
'その他のキー
Case Else
'通常処理でメッセージを返す
GoTo PGMEND
End Select
'コンボボックスのリスト部分が非表示のときは、メッセージを返さない
If SendMessage(hwnd, CB_GETDROPPEDSTATE, ByVal 0&, ByVal 0&) = 0 Then
GoTo PGMEXIT
End If
'キーアップ
Case WM_KEYUP
'wParamにはキーコードが入る
Select Case wParam
'カーソル↑←
Case vbKeyUp, vbKeyLeft
'1バイト目のフラグをおろす
bytKeyFlg = bytKeyFlg And (Not KEY_UP)
'カーソル↓→
Case vbKeyDown, vbKeyRight
'2バイト目のフラグをおろす
bytKeyFlg = bytKeyFlg And (Not KEY_DOWN)
End Select
'クリックやEnter入力時の処理
Case WM_COMMAND
'カーソル↑←やカーソル↓→が移動するたびに、値を設定してしまうのを防ぐ
If bytKeyFlg > 0 Then
'カーソルキーのフラグがたっているので、メッセージを返さない
GoTo PGMEXIT
End If
'強制的にDROPDOWNリストを閉じる
Call SendMessage(hwnd, CB_SHOWDROPDOWN, 0&, ByVal 0&)
End Select
PGMEND:
comboProc = CallWindowProc(pLngProc, hwnd, uMsg, wParam, lParam)
PGMEXIT:
End Function
-----標準モジュール(ここまで)-----
No.6
- 回答日時:
すいません。
さっきのエラーです。+書き忘れです。書き忘れは、コンボボックスのスタイルがドロップダウンリスト限定だと言うことです。ドロップダウンコンボのままでは無意味です。
エラーはカーソルで選んでエンターを押してもクリックイベントが発生しません。。。もうちょっと研究が必要です。。。m(__)m
No.4
- 回答日時:
> SendMessage Combo1, CB_SHOWDROPDOWN, 1, 0
の書き方が違います
SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 1, 0
が正しい書き方です。
でもこのAPI、ドロップダウンリストの表示/非表示の切り替えをするだけで、仕様を満たさないのではないのでしょうか?
No.3
- 回答日時:
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
If (KeyCode = vbKeyDown Or KeyCode = vbKeyUp) Then
SendMessage Combo1, CB_SHOWDROPDOWN, 1, 0
End If
End Sub
No.2
- 回答日時:
多分VBの標準機能では無理のような気がします。
あるといえば、
1.コンボボックスのプロセスを監視
2.キーダウンイベントにフラグを立てる
3.フラグによりテキストの変更を破棄させる
といったような処理ですが、プロセス監視は結構ムズイですよ。
デバッグもしづらいし。。。
No.1
- 回答日時:
オブジェクトは何ですか?コマンドボタンですか?
↓・↑はカーソルキーですか?
何らかのオブジェクトの上でカーソルキーを押したら、クリックイベントが発生するのを回避したいという捕らえ方でよろしいですか?
この回答への補足
やりたいことは、comboBoxでF4をおして内容を画面上に出力して
クリックされたときは、Enterと同じように選択さらた内容をとりこみ
次の項目にいきたいのです。
また、↑・↓は青の帯びが上下するだけにしたいのですがどうすればいいですか
またComboBoxには名称とコードをもたして
ComboBox.Textには名称のみ表示したいのですが
なかなかうまくいきません、これも何かいい方法はないのですか?
教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのレスポンシブが綺麗に動かない 3 2022/06/21 11:08
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- Chrome(クローム) Google Chromeのブラウザ(PC)ウインドウの移動について 3 2022/07/19 15:14
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- Visual Basic(VBA) ListBox1をClickしたときのイベント 5 2022/12/11 19:45
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- JavaScript javascriptで文字挿入でtoggleみたいなのはありますか? 2 2023/02/14 21:53
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- JavaScript addEventListener()でリスナー関数に名前を付ける構文を教えてください 1 2023/07/01 17:31
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetKeyStateについて
-
ダイアログベースでのキー入力...
-
Visual Basic 6.0 コンボボック...
-
【VB】タブ切り替え時のイベント
-
複数のテキストボックスのカン...
-
VB.NETのDropDownListをReadOnl...
-
C# DateTimePicker をキー入力...
-
VB.NETでフォームがない...
-
EXCEL VBA----ユーザーフォーム...
-
(VBA)チェックボックスのclick...
-
Excel VBA マクロ実行中のみテンキ...
-
特定のキーを押すまでループさ...
-
「ご処理進めて頂きますようお...
-
エクセルVBAで、MsgBox やInput...
-
EXCEL VBA 複数のImageコントロ...
-
UMLでの例外処理
-
【Excel】特定の文字を含むセル...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
UPS警告音を止めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB】タブ切り替え時のイベント
-
(VBA)チェックボックスのclick...
-
特定のキーを押すまでループさ...
-
タブキー押下時のイベントをひ...
-
KEYPREVIEW=TRUEについて。意味...
-
WPFでの時刻入力コントロールに...
-
一定時間操作されないと自動で...
-
テキストボックスの入力文字を1...
-
Visual Basic 6.0 コンボボック...
-
VB.NETでフォームがない...
-
コンボボックスにキー入力をさ...
-
自作ダイアログボックス中のエ...
-
エクセルVBAのテキストボック、...
-
Excel VBA マクロ実行中のみテンキ...
-
コントロールキーが押されたキ...
-
フォーカスについてお教えください
-
イベントハンドラが取得できな...
-
VB.NETのDropDownListをReadOnl...
-
C# WMPメディアの終了検知 その2
-
EXCEL VBA----ユーザーフォーム...
おすすめ情報