こんにちは、お世話になります。
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.
[MouseProc callback function (Windows)]
https://msdn.microsoft.com/en-us/library/ms644988(v=vs.85).aspx
の [Return value] をお読みください,
もし,意味がよく理解できないのであれば,
グローバルフックというものが,どういうものかを再度調べてみてください.
ちなみに、テヤメフォ右クリックのメニューは良く見ると、通常メニューと少し違います。
スススススススススススススススススススススススススススススススススススススススス
ニコ ホ
トコ イーアキッークッアーィ木ゥ ーーコエオコウウ 書込者ノト:ロ 」、ヤァ」、マヘノニ? オ ン
ヲサちなみに、テヤメフォ右クリックのメニューは良く見ると、通常メニューと少し違います。ヲサ
ちょっと勘違いでした。
(テヤメフォ右クリックだと、選択アイテムがマウスカーソルが示すものとは違うようなョョョ)
スススススススススススススススススススススススススススススススススススススススス
ニコ ヘョリメチル
トコ イーアキッークッアーィ木ゥ アーコアキコーー 書込者ノト:ロ 「「「 ン
ヲサロヘミヲサヲサヲサィラゥン
ヲサコッッョョッュッッカエエケククィスョクオゥョ
ゴメンなさい.間違えました.
ローレベルフックですから,以下ですが,内容は同じです.
コッッョョッュッッッッカエエケクカィスョクオゥョ
スススススススススススススススススススススススススススススススススススススススス
ニコ いつもここから
トコ イーアキッークッアーィ木ゥ アオコアアコエエ 書込者ノト:ロ 「。。 「 ン
とりあえず、返す値をウにしたらうまくいきました。
ッッュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ
ヲサヲサヲサテヲサスヲサネテ゜チテヤノマホヲサヲサ
ヲサヲサヲサヲサッッミヘィニアョネャヲサラペチミミォアーーャヲサミャヲサーゥサ
ヲサヲサヲサヲサヲサヲサノテヲサヲサコスヲサィヌヒモィヨピテマホヤメマフゥヲサヲサ、クーーーゥサ
ヲサヲサヲサヲサヲサヲサッッヲサィラミヲサスヲサラペメツユヤヤマホトマラホゥヲサィノテヲサヲサヲサヲサアヲサゥヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサィラミヲサスヲサラペメツユヤヤマホトマラホゥヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサメヲサコスヲサーサ
ヲサヲサヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサヲサッッ
ヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサィラミヲサスヲサラペメツユヤヤマホユミゥヲサィノテヲサヲサヲサヲサーヲサゥヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピテャヲサーャヲサーャヲサーゥサヲサッッ押した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピホユヘミチトオャヲサーャヲサーャヲサーゥサヲサッッ押した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピホユヘミチトオャヲサーャヲサヒナルナヨナホヤニ゜ヒナルユミャヲサーゥサヲサッッ放した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピテャヲサーャヲサヒナルナヨナホヤニ゜ヒナルユミャヲサーゥサヲサッッ放した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサヲサメヲサコスヲサウサッッヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサこの値を変更
ヲサヲサヲサヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサッッヲサヲサヲサヲサコスヲサヲサォヲサアサ
ヲサヲサヲサヲサヲサヲササ
ヲサヲササ
スススススススススススススススススススススススススススススススススススススススス
ニコ いつもここから
トコ イーアキッークッアーィ木ゥ アオコウキコオイ 書込者ノト:ロ 「。。 「 ン
モコ
ありがとうございます、一応解決しました。
いろいろやって動作確認します。
さっそく、新しい問題が発生したのでスレッドを変えて質問します。