Bloquer le menu contextuel dans un TTreeView
Une astuce permettant de désactiver le menu contextuel lors de l’édition d’un nœud dans un TTreeView.
L’idée consiste à intercepter la procédure fenêtre du contrôle d’édition interne et à filtrer le message WM_CONTEXTMENU.
Résultat : plus de clic droit pendant l’édition, tout en conservant le comportement normal du contrôle.
Une solution simple, efficace et 100 % API Windows.
var
Form1: TForm1;
OriginalWndProc: Pointer;
implementation
uses
CommCtrl;
{$R *.dfm}
function EditWndProc(Wnd: HWND; Msg: UINT; wParam: wParam; lParam: lParam): LRESULT; stdcall;
begin
if Msg = WM_CONTEXTMENU then
Exit(0); // Bloque le menu contextuel
Result := CallWindowProc(OriginalWndProc, Wnd, Msg, wParam, lParam);
end;
procedure TForm1.TreeView1Editing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
var
EditHandle: HWND;
begin
AllowEdit := True;
EditHandle := TreeView_GetEditControl(TreeView1.Handle);
if EditHandle <> 0 then
begin
OriginalWndProc := Pointer(GetWindowLongPtr(EditHandle, GWLP_WNDPROC));
SetWindowLongPtr(EditHandle, GWLP_WNDPROC, LONG_PTR(@EditWndProc));
end;
end;Un petit clic (J'aime) qui fait plaisir !