控制面板应用程序不起作用

时间:2015-08-07 00:30:28

标签: delphi

我正在尝试创建一个简单的* .cpl小程序,它调用* .exe文件。

我有这段代码:

uses
  shellapi;

procedure TAppletModule1AppletModule.AppletModuleActivate(Sender: TObject;
  Data: Integer);
begin
  ShellExecute(0, 'open', 'Control Panel_betteryless.exe', '', '', SW_NORMAL);
end;

当我双击Project1.cpl时,没有任何反应。当我在System32目录中复制Project1.cpl时,控制面板中不会添加任何其他条目。

我做错了什么?

更新以下是我尝试的实际情况:

数字化仪的供应商在2011年发布了他们的驱动程序。它们与Windows 10不兼容。它与Windows 7完全兼容。但是,我发现了一些如何强制执行兼容性的调整,因此设备现在正常工作。

该驱动程序包含一个名为 tablet.cpl 的CPL和 Control Panel_betteryless.exe [sic!],它们安装在 System32 中。不知何故,安装程序没有注册 tablet.cpl 。通过doubleclick运行控制Panel_betteryless.exe 。现在我想让这个CPL或EXE出现在控制面板中(最后,我想修改驱动程序,所以我有一个"固定的驱动程序"用于将来的安装)。

我创建了以下注册表项:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cpls\tablet.cpl]
"RunLevel"=dword:00000000

但在控制面板中,没有添加任何项目。

为了确保CPL没有缺陷,我已将telephon.cpl复制为tablet.cpl并再次尝试。我希望Telephony条目现在在控制面板中两次。但没有改变。

1 个答案:

答案 0 :(得分:2)

您可以在.cpl文件夹中放置一个32位%SystemRoot%\SysWow64文件,在.cpl文件夹中放置一个64位%SystemRoot%\System32文件,这两个文件都将显示在控制面板中必须注册他们。但是,如果要将.cpl文件存储在其他位置,则必须明确注册,如文档中所述:

How to Register DLL Control Panel Items

例如:

32位

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Control Panel\Cpls

  [REG_EXPAND_SZ] "MyCpl" = "%ProgramFiles%\MyApp\MyApplet.cpl"

64

HKLM\Software\Microsoft\Windows\CurrentVersion\Control Panel\Cpls

  [REG_EXPAND_SZ] "MyCpl" = "%ProgramFiles%\MyApp\MyApplet.cpl"

无论您放置.cpl文件的位置,默认情况下,只有当“查看方式”字段设置为“大图标”或“小图标”时,小程序才会显示在“控制面板”中。如果您希望applet显示在特定类别中,则必须注册,例如:

32位

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Contro‌​l Panel\Extended Properties\System.ControlPanel.Category

  [REG_DWORD] "%ProgramFiles%\MyApp\MyApplet.cpl" = 1

64

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Contro‌​l Panel\Extended Properties\System.ControlPanel.Category

  [REG_DWORD] "%ProgramFiles%\MyApp\MyApplet.cpl" = 1

如果您希望小程序显示在多个类别中,请使用REG_SZ代替REG_DWORD。实际数字记录在这里:

Assigning Control Panel Categories

在我的示例中,我使用的是Appearance and Personalization类别。

现在,据说,Delphi 32bit .cpl在Windows 10上工作正常,但在Windows 10上有64位.cpl崩溃,在{{1}之前有两条弹出EAccessViolation消息然后触发事件(Windows 7上不会发生TAppletModule.OnActivate错误)。我不知道为什么它会崩溃,也许微软在applet初始化过程中EAccessViolation API改变了一些CplApplet()没有考虑到的东西(我没有在Windows 10上安装Delphi来调试它)。但是,TAppletModule无论如何都是遗留的,不应该用于新的applet。您可以根据文档注册.cpl本身直接显示在控制面板中:

How to Register Executable Control Panel Items

例如:

Control Panel_betteryless.exe

其中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\{guid} (Default) = "betteryless" HKEY_CLASSES_ROOT\CLSID\{guid} (Default) = "betteryless" [REG_SZ] "System.ControlPanel.Category" = "1" HKEY_CLASSES_ROOT\CLSID\{guid}\Shell\Open\Command (Default) = [REG_EXPAND_SZ] "%SystemRoot%\System32\Control Panel_betteryless.exe" 是您创建的GUID,例如Delphi中的 CTRL + SHIFT + G 键盘组合代码编辑器。