押されたキーでポップアップメニューを切り替える方法

このQ&Aのポイント
  • ワークシート上で右クリックにてポップアップメニューが表示されますが、Ctrl+右クリック、Shirf+右クリック、Alt+右クリックにて、独自のポップアップメニューを表示させようてしています。
  • クラスモジュールを使用し、右クリックイベント内で押されたキーを判断して表示するメニューを切り替えることは可能です。
  • 独自のポップアップメニューの追加や表示はすでにできています。
回答を見る
  • ベストアンサー

押されたキーにてポップアップメニューを切り替える

OS:XP SP2 アプリ:Excel 2002 ワークシート上で右クリックにてポップアップメニューが表示されますが、Ctrl+右クリック、Shirf+右クリック、Alt+右クリックにて、独自のポップアップメニューを表示させようてしています。 プロジェクトにクラスモジュールを追加し下記の様に宣言しています。 Private WithEvents App As Application Private Sub Class_Initialize() Set App = Application End Sub 右クリックイベント内で現在押されているキーを判断することはできないでしょうか? Private Sub App_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) ここで押されたキーにて表示するメニューを切り替える End Sub 独自のポップアップメニューの追加/表示はできています。 ご教授のほど宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Excelのみでは無理だと思います WinAPIのGetKeyboardState/GetKeyStateを使えばキーの状態を判断できます GetKeyboardStateは256個Byte型配列を準備して使います GetKeyStateは引数に調べたいキーの仮想キーコードを使います API宣言 ' 行頭のPrivateはクラス(シート)モジュールで宣言する場合です ' 標準モジュールで宣言するならPublicに変更しましょう Private Declare Function GetKeyboardState _   Lib "user32" (pbKeyState As Byte) As Long Private Declare Function GetKeyState _   Lib "user32" (ByVal nVirtKey As Long) As Integer Dim bVKBuf(255) as Byte 使い方 Sub M1()   MsgBox ""   GetKeyBoardState bVKBuf(0)   dim n as integer   for n = 1 to 256     Cells( n, 1) = bVKBuf( n-1 )   next   ' bVKBuf(16)がShift、bVKBuf(17)がCtrl End Sub Sub M2()   MsgBox ""   dim nS as Integer, nC as Integer   nS = GetKeyState( 16 ) ' Shift   nC = GetKeyState( 17 ) ' Ctrl   MsgBox nS & " , " & nC End Sub といった具合のコードで 最初のMSGBOXが表示された状態で『Shift』または『Ctrl』または両方を押しながら『OK』をクリックしてみてください M1ですと A17,A18が 128や129になれば Shift,Ctrlが押されています M2ですと -127,-128などと表示されます 前がShift、後ろがCtrlです 押されているかの判断は bS = ( nS and &h80 ) = &h80 bC = ( nC and &h80 ) = &h80 bS = ( bVKBuf(16) and &h80 ) = &h80 bC = ( bVKBuf(17) and &h80 ) = &h80 などとしたほうがわかりやすいかも … True/Falseで返ってきますから

yabe440
質問者

お礼

回答ありがとうございます。 やはりAPIなしでは無理でしたか... 早速、下記の様に処理し解決いたしました。 bS = (GetKeyState(16) And &H80) = &H80 'Shift bC = (GetKeyState(17) And &H80) = &H80 'Ctrl bA = (GetKeyState(18) And &H80) = &H80 'Alt ご教授ありがとうございました。

関連するQ&A

  • ExcelのVBAについてです。

    Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) UserForm1.Show End Sub というコードで、シート上で右クリックしたら、ユーザーフォームを表示するようにしたんですが、ユーザーフォームを閉じると右クリックメニューが出てきます。これを出なくするにはどのようにしたらいいのでしょうか。教えてください。よろしくお願いします。

  • ポップアップメニューがおかしいです。

    ポップアップメニューや右クリックメニューが透明に表示されています。見にくくてしょうがありません。だれか助けてください。。。。

  • ポップアップメニュー

    ポップアップメニューについて質問させて頂きます。 リストビュー上で右クリックしたときにポップアップメニューを表示させているのですが、このポップアップメニューの項目がクリックされた時のイベントの取り方が分かりません。 ご存知の方、宜しくお願いします。 環境はVisual Studio6.0 Windows2000です

  • タスクトレイのポップアップメニュー

    こんにちわ。 タスクトレイにアイコンを登録し、右クリックでポップアップメニューを表示しています。 そのポップアップを表示している状態でデスクトップを左クリックしてもメニューが消えないのはなぜでしょうか?ポップアップされたメニューをクリックしないとメニューが消えてくれません。 何かのイベントでメニューを消す処理をいれておくのでしょうか? どなたか宜しくお願いします。 (VB6 SP5で作成しました。)

  • スクリーンからはみ出ないポップアップ(win32api)

    win32apiでアプリケーションを作っています。 右クリックしたときに表示されるポップアップメニューがスクリーンからはみ出ないように、右クリックされた時にポップアップがはみ出るようならポップアップの位置を調整する、ということをしたいです。 その為には表示されるポップアップのサイズが分からないといけないのですが、ポップアップのサイズを得る方法はありますか?大体でやってしまってもあまり問題はないかもしれませんが。 回答よろしくお願いします。

  • Excell2010VBAmacro互換性

    マイクロソフトオフィス2010EXCELマクロについて質問させてください。 VBAマクロでマウス右クリック時にポップアップメニューを出し、 自作マクロを呼び出すようにしました。動作している。 このマクロを別PCのオフィス2013で動作させると、 マクロ内部ではポップアップメニューを作成動作している ようです(デバッグで通っていること確認)ようですが、 EXCEL画面上にはメニューが表示されません。 サンプルマクロは下記参照。 非互換または設定漏れがあるのでしょうか?   サンプルマクロ Sheet1 --------------------------------------- Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Application.CommandBars("Cell").Reset '右クリックメニューを初期設定に戻す Call set_RightMenu '右メニュー登録 End Sub Module1 --------------------------------------- Sub reset_RightMenu() ' '右クリックメニューを初期化 ' Application.CommandBars("Cell").Reset End Sub Public Sub set_RightMenu() ' ' 右クリックメニューを設定する ' Call reset_RightMenu '右クリックメニュー初期化 With Application.CommandBars("Cell") _ .Controls.Add() .BeginGroup = True .Caption = "menu0" .FaceId = 682 .OnAction = "menu0" End With With Application.CommandBars("Cell") _ .Controls.Add(Type:=msoControlPopup) .BeginGroup = True .Caption = "SubMenu" With .Controls.Add(Type:=msoControlButton) .Caption = "menu1" .FaceId = 931 .OnAction = "menu1" End With With .Controls.Add(Type:=msoControlButton) .Caption = "menu2" .FaceId = 931 .OnAction = "menu2" End With End With End Sub Sub menu0 MsgBox "****** Menu 0 *******" End Sub Sub menu1 MsgBox "****** Menu 1 *******" End Sub Sub menu2 MsgBox "****** Menu 2 *******" End Sub

  • autohotkeyのポップアップメニューについて

    autohotkeyを以下環境で使用しています。 OS: Windows7 64bit autohotkey: Ver 1.0.48.05 やりたい事: 通知領域にあるautohotkeyアイコンを右クリックして、 ポップアップメニューから"Reload This Script"を選びたい (添付画像を参照してください) 以下のようにスクリプトを組みました Ctrl+Alt+vにて起動 autohotkeyアイコンは、座標(1000, 800)にあるとします。 ^!v:: MouseClick, RIGHT, 1000, 800, , 5 Sleep, 1000 Send, r return 実行すると右クリックのポップアップメニューまでは表示されるのですが、 "Send, r"が実行されず、"Reload This Script"が選べません。 ※この状態で、手動で"r"キーを押すと、きちんと"Reload This Script"が実行されます 通知領域アイコンを右クリックして出てくるポップアップメニューにコマンドを通すのは、 "Send, r"ではなくて特別なコマンドが必要なのでしょうか? 以上、よろしくお願いいたします。

  • WM_TIMERからポップアップメニューを閉じるには?

    質問させて頂きます。 現在C++にてWin32SDKを使用し開発を行っております そこで、メインウィンドウが非表示の時にもポップアップメニューを表示するようにしているのですが 非表示の際、ホットキーからポップアップメニューを表示すると ポップアップメニュー以外をクリックしても消えますが WM_TIMER等、一定時間経過時に表示した場合 ポップアップメニュー以外をクリックしても消えません WM_HOTKEYでは SetForegroundWindow関数でアクティブにした後に TrackPopupMenu関数でポップアップメニューを表示して 関係ない所をクリックされてもうまく消えます WM_TIMERでもWM_HOTKEYと同じ処理をしても上手くいきません タスクトレイの右クリックと同じく TrackPopupMenu関数の後にWM_NULLをポストしてもメニューは消えません 何か上手く解決出来る方法は無いでしょうか? どうぞよろしくお願いします。

  • 右クリックでポップアップメニューを表示したい

    Visual Basic6.0右クリック時にポップアップメニュー(コンテキストメニュー)を表示したいのですが、Webで調べてもよくわかりませんでした。メニューエディタを使って、メニューを作成することはできましたが、フォームの上段に表示されるメニューしか作成できません。MouseUpイベントを使用して右クリックを判別するところまではわかりましたが、肝心のポップアップメニューのメニューの作り方、使用方法をご存知の方いらっしゃいましたらご回答よろしくお願いします。

  • コントロール上でのポップアップメニューによる貼り付けを拒否したいのですが・・・・

    こんにちわ。 現在VB6でソフト開発を行っており、テキストボックスへの入力制限について手動で制御しようとしています。 例えば、あるコントロールでは「半角数字の1~5のみを入力できるように」というような具合にです。 そのために、コントロールのKeyPressイベントで下記のようにコーディングしており、キーボードによる入力制限はこれで上手く制御できていますが、 他のアプリケーションでクリップボードにコピーした文字列を、このコントロール上でポップアップメニュー(マウスの右ボタンクリック)によって貼り付けをすると英数字でも貼り付けできてしまうのです。(Ctrl+Vは防げています) Private Sub txtBin_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case vbKey1 To vbKey5 '数字のみ入力可 Case vbKeyBack Case vbKeyReturn Or vbKeyTab cmdSearch.SetFocus 'フォーカスの移動 Case Else KeyAscii = 0 End Select End Sub これを回避する方法として考え付く方法またはそれ以外の方法で良い案が あればどなたかご教授ください。 (1)アプリケーション全体においてクリップボード自体を使用不可にする方法 (2)独自に作ったポップアップメニューをアプリケーション全体に一括で設定する方法。(各コントロールのMouseDownで設定する方法は知っていますが、ひとつひとつ設定するにはあまりにコントロールの数が多いので。。。) (3)文化オリエント社のInputManでマスクをする方法。 あとは思いつきませんが、上記の3つでもだめだよとか、そんなご意見があればお願いします。

専門家に質問してみよう