Ctrl+右クリックで右クリックメニューを表示させたくない


いつもここから  2017-08-09 15:47:55  No: 48721  IP: 192.*.*.*

こんにちは、お世話になります。
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.

編集 削除
Mr.XRAY  2017-08-09 22:37:11  No: 48722  IP: 192.*.*.*

[MouseProc callback function (Windows)]
https://msdn.microsoft.com/en-us/library/ms644988(v=vs.85).aspx

の [Return value] をお読みください,
もし,意味がよく理解できないのであれば,
グローバルフックというものが,どういうものかを再度調べてみてください.

編集 削除
Nov  2017-08-09 23:44:20  No: 48723  IP: 192.*.*.*

ちなみに、テヤメフォ右クリックのメニューは良く見ると、通常メニューと少し違います。
スススススススススススススススススススススススススススススススススススススススス
ニコ ホ
トコ イーアキッークッアーィ木ゥ ーーコエオコウウ  書込者ノト:ロ 」、ヤァ」、マヘノニ?  オ ン

ヲサちなみに、テヤメフォ右クリックのメニューは良く見ると、通常メニューと少し違います。ヲサ
ちょっと勘違いでした。
(テヤメフォ右クリックだと、選択アイテムがマウスカーソルが示すものとは違うようなョョョ)
スススススススススススススススススススススススススススススススススススススススス
ニコ ヘョリメチル
トコ イーアキッークッアーィ木ゥ アーコアキコーー  書込者ノト:ロ 「「「 ン

ヲサロヘミヲサヲサヲサィラゥン
ヲサコッッョョッュッッカエエケククィスョクオゥョ

ゴメンなさい.間違えました.
ローレベルフックですから,以下ですが,内容は同じです.

コッッョョッュッッッッカエエケクカィスョクオゥョ
スススススススススススススススススススススススススススススススススススススススス
ニコ いつもここから
トコ イーアキッークッアーィ木ゥ アオコアアコエエ  書込者ノト:ロ 「。。 「 ン

とりあえず、返す値をウにしたらうまくいきました。

ッッュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュ
ヲサヲサヲサテヲサスヲサネテ゜チテヤノマホヲサヲサ

ヲサヲサヲサヲサッッミヘィニアョネャヲサラペチミミォアーーャヲサミャヲサーゥサ

ヲサヲサヲサヲサヲサヲサノテヲサヲサコスヲサィヌヒモィヨピテマホヤメマフゥヲサヲサ、クーーーゥサ
ヲサヲサヲサヲサヲサヲサッッヲサィラミヲサスヲサラペメツユヤヤマホトマラホゥヲサィノテヲサヲサヲサヲサアヲサゥヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサィラミヲサスヲサラペメツユヤヤマホトマラホゥヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサメヲサコスヲサーサ
ヲサヲサヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサヲサッッ
ヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサィラミヲサスヲサラペメツユヤヤマホユミゥヲサィノテヲサヲサヲサヲサーヲサゥヲサヲサ

ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピテャヲサーャヲサーャヲサーゥサヲサッッ押した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピホユヘミチトオャヲサーャヲサーャヲサーゥサヲサッッ押した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピホユヘミチトオャヲサーャヲサヒナルナヨナホヤニ゜ヒナルユミャヲサーゥサヲサッッ放した状態にする
ヲサヲサヲサヲサヲサヲサヲサヲサ゜ィヨピテャヲサーャヲサヒナルナヨナホヤニ゜ヒナルユミャヲサーゥサヲサッッ放した状態にする

ヲサヲサヲサヲサヲサヲサヲサヲサヲサメヲサコスヲサウサッッヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサこの値を変更
ヲサヲサヲサヲサヲサヲサヲサヲサヲササ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサッッヲサヲサヲサヲサコスヲサヲサォヲサアサ
ヲサヲサヲサヲサヲサヲササ
ヲサヲササ
スススススススススススススススススススススススススススススススススススススススス
ニコ いつもここから
トコ イーアキッークッアーィ木ゥ アオコウキコオイ  書込者ノト:ロ 「。。 「 ン
モコ 

ありがとうございます、一応解決しました。
いろいろやって動作確認します。

さっそく、新しい問題が発生したのでスレッドを変えて質問します。

編集 削除