掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Ctrl+右クリックで右クリックメニューを表示させたくない (ID:48721)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんにちは、お世話になります。 Delphi10を使用しています。 グローバルフックを使って、Ctrl+マウスの右クリックで自作メニューを表示させようとしています。(マウスの右クリックだけの場合は通常の右クリックメニュー) 次のプログラムを作ったのですが、マウスの右クリックの場合通常のメニュー、Ctrl+右クリックで通常のメニューが表示された後に自作メニューが表示されます。 通常のメニューを表示させないためにはどう変えればいいでしょうか? //------------------------------------------ unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ExtCtrls, ComCtrls, ShellAPI; type TForm1 = class(TForm) BtnStart: TButton; procedure BtnStartClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; n:Integer; implementation {$R *.dfm} //----------------------------------------------------------- // 低レベルキーフックの情報構造体と定数 // LLMHF_INJECTEDはマウスフックで使用 // // Microsoft Windows SDK 7.1の記述(構造体もSDKからのもの) // Low level hook flags // // #define LLKHF_EXTENDED (KF_EXTENDED >> 8) // #define LLKHF_INJECTED 0x00000010 // #define LLKHF_ALTDOWN (KF_ALTDOWN >> 8) // #define LLKHF_UP (KF_UP >> 8) // #define LLMHF_INJECTED 0x00000001 //------------------------------------------------------------ const LLKHF_EXTENDED = KF_EXTENDED shr 8; LLKHF_INJECTED = $00000010; LLKHF_ALTDOWN = KF_ALTDOWN shr 8; LLKHF_UP = KF_UP shr 8; LLMHF_INJECTED = $00000001; type LPKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; tagKBDLLHOOKSTRUCT = record vkCode : DWORD; scanCode : DWORD; flags : DWORD; time : DWORD; dwExtraInfo : ULONG_PTR; end; KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT; TKbDllHookStruct = KBDLLHOOKSTRUCT; PKbDllHookStruct = LPKBDLLHOOKSTRUCT; //---------------------------------------- // 低レベルマウスフックのキー情報構造体 //---------------------------------------- LPMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT; tagMSLLHOOKSTRUCT = record pt: TPOINT; mouseData: DWORD; flags: DWORD; time: DWORD; dwExtraInfo: ULONG_PTR; end; MSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT; TMsllHookStruct = MSLLHOOKSTRUCT; PMsllHookStruct = LPMSLLHOOKSTRUCT; var KeyHookHandle : HHOOK; MouseHookHandle : HHOOK; TargetWnd : HWND; //--------------------------------- // マウスフックのコールバック関数 //--------------------------------- function LowLevelMouseProc(nCode:integer; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall; var IsCtrl:Integer; Label Label1; begin if nCode < 0 then begin Result := CallNextHookEx(MouseHookHandle, nCode, wPar, lPar); exit; end; if nCode = HC_ACTION then begin IsCtrl := (GetKeyState(VK_CONTROL) and $8000); if (WPar = WM_RBUTTONDOWN) then begin Result := 0; exit; end; if (WPar = WM_RBUTTONUP) and(IsCtrl <> 0 ) then begin keybd_event(VK_Control, 0, 0, 0); //押した状態にする// Ctrl+5で自作メニュー表示 keybd_event(VK_NUMPAD5, 0, 0, 0); //押した状態にする keybd_event(VK_NUMPAD5, 0, KEYEVENTF_KEYUP, 0); //放した状態にする keybd_event(VK_Control, 0, KEYEVENTF_KEYUP, 0); //放した状態にする Result := 0; exit; end; end; Label1: Result := CallNextHookEx(MouseHookHandle, nCode, wPar, lPar); end; //------------------------ // フック開始 //------------------------ procedure TForm1.BtnStartClick(Sender: TObject); begin //マウスのグローバルフック開始 if MouseHookHandle = 0 then begin MouseHookHandle := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0); end; end; procedure TForm1.FormCreate(Sender: TObject); begin end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.