C# 如何在“安装程序”对话框中禁用“取消”按钮

C# 如何在“安装程序”对话框中禁用“取消”按钮,c#,installation,custom-action,C#,Installation,Custom Action,有时我想在安装软件包时禁用“取消”按钮,因为我使用的是visual studio安装程序。 我想从代码端禁用此取消按钮 下面是一个使用WIN32 API的解决方案: 使用Spy++获取窗口的类名,并使用函数FindWindow进行搜索 通过FindWindowEx获取按钮hwnd 通过EnableWindow禁用它 下面是我的示例代码: Win32函数声明: 禁用按钮的代码: 这里是我的测试窗口: 我认为附带的msi安装程序是不可能的。也许使用更高级的东西,比如InstallShiel

有时我想在安装软件包时禁用“取消”按钮,因为我使用的是visual studio安装程序。


我想从代码端禁用此取消按钮

下面是一个使用WIN32 API的解决方案:

  • 使用Spy++获取窗口的类名,并使用函数FindWindow进行搜索
  • 通过FindWindowEx获取按钮hwnd
  • 通过EnableWindow禁用它
下面是我的示例代码:

Win32函数声明:

禁用按钮的代码:

这里是我的测试窗口:


我认为附带的msi安装程序是不可能的。也许使用更高级的东西,比如InstallShield。。但是,我想不出有哪种情况我想剥夺用户随时取消安装的自由。请尝试在安装过程中运行自定义操作。也许您可以用Win32 API禁用该按钮。@Oscar->在自定义操作中,当exe正在运行时,我正在调用不同的exe,用户无需取消此安装。。。情况就是这样。@cansik->谢谢,我很想搜索一些如何为这个案例提供API的方法,但是我无法得到,告诉如何调用..@VikramBose>我已经添加了一个答案!我试过了,但它没有被禁用,EnableWindow(hwndButton,false)返回false,我不知道出了什么问题;第二个参数是标题还是什么?@VikramBose第二个参数是窗口的名称!
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
IntPtr hwndWindow = FindWindow("MsiDialogCloseClass", "Installer");
IntPtr hwndButton = FindWindowEx((IntPtr)hwndWindow, IntPtr.Zero, "Button", "Cancel");

if (EnableWindow(hwndButton, false))
{
    //has been disabled
}