[英]Adding context menu to Inno Setup page
How can I add some context menu to a specific page of Inno Setup?如何向 Inno Setup 的特定页面添加一些上下文菜单?
For example in installing page, if the user right-clicks on-page, he can see "Cancel" or "Pause" menu items which can do some action.例如在安装页面中,如果用户在页面上单击鼠标右键,他可以看到“取消”或“暂停”菜单项,可以执行某些操作。
Inno Setup does not have an API how context menus, not even for handling mouse clicks. Inno Setup 没有 API How 上下文菜单,甚至没有用于处理鼠标点击。 So you need to implement a custom Windows message handler and handle WM_CONTEXTMENU
.所以你需要实现一个自定义的 Windows 消息处理程序并处理WM_CONTEXTMENU
。
[Code]
const
GWL_WNDPROC = -4;
WM_CONTEXTMENU = $007B;
WM_COMMAND = $0111;
type
WPARAM = UINT_PTR;
LPARAM = LongInt;
LRESULT = LongInt;
const
MF_BYPOSITION = $0400;
MF_STRING = $0000;
const
ID_MUTE = 0;
ID_STOP = 1;
function CallWindowProc(
lpPrevWndFunc: LongInt; hWnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; external 'CallWindowProcW@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: LongInt): LongInt;
external 'SetWindowLongW@user32.dll stdcall';
function CreatePopupMenu: THandle; external 'CreatePopupMenu@User32.dll stdcall';
function InsertMenu(
hMenu: THandle; uPosition: Cardinal; uFlags: Cardinal; uIDNewItem: Cardinal;
lpNewItem: string): Boolean;
external 'InsertMenuW@User32.dll stdcall';
function TrackPopupMenu(
hMenu: THandle; uFlags: Cardinal; x: Integer; y: Integer; nReserved: Integer;
hWnd: THandle; Rect: Integer): Boolean;
external 'TrackPopupMenu@User32.dll stdcall';
function ClientToScreen(hWnd: HWND; var lpPoint: TPoint): Boolean;
external 'ClientToScreen@user32.dll stdcall';
var
OldPageWndProc: LongInt;
Page: TWizardPage;
function GET_X_LPARAM(dw: DWORD): WORD; // aka LOWORD
begin
Result := WORD(dw);
end;
function GET_Y_LPARAM(dw: DWORD): WORD; // aka HIWORD
begin
Result := WORD((dw shr 16) and $FFFF);
end;
function PageWndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
PopupMenu: THandle;
X, Y: Integer;
begin
if uMsg = WM_CONTEXTMENU then
begin
X := GET_X_LPARAM(lParam);
Y := GET_Y_LPARAM(lParam);
PopupMenu := CreatePopupMenu();
InsertMenu(PopupMenu, -1, MF_BYPOSITION or MF_STRING, ID_MUTE, 'Mute');
InsertMenu(PopupMenu, -1, MF_BYPOSITION or MF_STRING, ID_STOP, 'Stop');
TrackPopupMenu(PopupMenu, 0, X, Y, 0, Page.Surface.Handle, 0);
end
else
if uMsg = WM_COMMAND then
begin
if wParam = ID_MUTE then
begin
MsgBox('Muting', mbInformation, MB_OK);
Result := 0;
end
else
if wParam = ID_STOP then
begin
MsgBox('Stopping', mbInformation, MB_OK);
Result := 0;
end;
end
else
begin
Result := CallWindowProc(OldPageWndProc, hwnd, uMsg, wParam, lParam);
end;
end;
procedure InitializeWizard();
begin
Page := CreateCustomPage(wpWelcome, 'Page with context menu', '');
OldPageWndProc :=
SetWindowLong(Page.Surface.Handle, GWL_WNDPROC, CreateCallback(@PageWndProc));
end;
procedure DeinitializeSetup;
begin
SetWindowLong(Page.Surface.Handle, GWL_WNDPROC, OldPageWndProc);
end;
The GWL_WNDPROC
code is based on Inno Setup - How to edit the "About Setup" dialog text box . GWL_WNDPROC
代码基于Inno Setup - 如何编辑“关于设置”对话框文本框。
If you want to add icons, see Adding an icon image to context menu in Inno Setup .如果要添加图标,请参阅将图标图像添加到 Inno Setup 中的上下文菜单。
For CreateCallback
function , you need Inno Setup 6. If you are stuck with Inno Setup 5, you can use WrapCallback
function from InnoTools InnoCallback library.对于CreateCallback
功能,你需要创新安装6.如果你被卡住Inno Setup的5,你可以使用WrapCallback
功能从InnoTools InnoCallback库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.