drag-and-drop - 如果标题栏被禁用,则使 Inno Setup WizardForm 可移动

标签 drag-and-drop window inno-setup draggable pascalscript

我想制作一个具有自定义外观的安装程序,并通过将 BorderStyle 设置为 bsNone 来禁用标题栏。

现在我无法再移动窗口了。我环顾四周,找到了 Delphi 的解决方案:
http://www.chami.com/tips/delphi/010397D.html

这可以在 Inno Setup 中完成吗?

我已经在 MSDN 上查找了 WM_NCHITTEST 内容,但我不知道是否以及如何才能完成这项工作。

编辑:环顾四周并使用 advanced compiler 进行编译后高级编译器我想出了这个,但它不起作用。它可以编译,但是当我在窗口内单击时,我无法拖动它。

procedure Dragg(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  SendMessage(WizardForm.Handle, $F112, $F012, 0);
end;

procedure InitializeWizard();
begin
  WizardForm.OnMouseDown := @Dragg;
end;

最佳答案

没有。无法处理消息或更改控件的 WndProc。有一点机会来实现像this post中那样的未记录的拖动 Action 。 ,但不幸的是 InnoSetup 没有为脚本发布发布鼠标按下事件,因此如果没有一些外部库,您就很不幸。

<小时/>

使用您提到的库和代码;您缺少 ReleaseCapture 函数调用。请改用此脚本代码(不要忘记,向导表单的唯一裸露部分位于左下角):

[Code]
function ReleaseCapture: BOOL;
  external 'ReleaseCapture@user32 stdcall';

const
  SC_DRAGMOVE = $F012;
  WM_SYSCOMMAND = $0112;

procedure OnMouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  WizardForm.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;

procedure InitializeWizard;
begin
  WizardForm.OnMouseDown := @OnMouseDown;
end;

关于drag-and-drop - 如果标题栏被禁用,则使 Inno Setup WizardForm 可移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792168/

相关文章:

javascript - 设置或分配 'window.location' 时的 Jest 错误

JavaScript WIndow Print - 我希望它打印特定的 div

inno-setup - 获取 setup.exe 文件的文件名

python - 我应该授予我的应用程序对程序文件的写入权限吗?

inno-setup - 如何在 InnoSetup 中提取子字符串?

windows - 如何获得新式 Windows 拖放光标

jquery - html 5 中的 event.originalEvent.dataTransfer.files 和 event.dataTransfer.files 之间的区别

java - SWT DragSourceEvent 图像未正确锚定到鼠标指针

wpf - DoDragDrop() - droptarget 是另一个应用程序(word 或 excel)

c++ - 窗口出现奇怪的 SFML 错误