【发布时间】:2018-01-20 21:27:36
【问题描述】:
在 Delphi 中,创建一个 VCL 表单应用程序。如果您在 64 位 Windows 上,请使用 64 位 Windows 平台。
使用以下代码:
unit Unit1;
interface
uses
CodeSiteLogging,
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure GetControlPanelItems;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Winapi.ShlObj, Winapi.ShellAPI, System.Win.ComObj;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
GetControlPanelItems;
end;
procedure TForm1.GetControlPanelItems;
var
psfDeskTop: IShellFolder;
psfControl: IShellFolder;
pidControl: PITEMIDLIST;
pidChild: PITEMIDLIST;
pidAbsolute: PItemIdList;
pEnumList: IEnumIDList;
celtFetched: ULONG;
FileInfo: SHFILEINFOW;
ShExeInfo: SHELLEXECUTEINFO;
begin
OleCheck(SHGetDesktopFolder(psfDeskTop));
OleCheck(SHGetSpecialFolderLocation(0, CSIDL_CONTROLS, pidControl));
OleCheck(psfDeskTop.BindToObject(pidControl, nil, IID_IShellFolder, psfControl));
OleCheck(psfControl.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN or SHCONTF_FOLDERS, pEnumList));
while pEnumList.Next(1, pidChild, celtFetched) = 0 do
begin
pidAbsolute := ILCombine(pidControl, pidChild);
SHGetFileInfo(LPCTSTR(pidAbsolute), 0, FileInfo, SizeOf(FileInfo), SHGFI_PIDL or SHGFI_DISPLAYNAME or SHGFI_TYPENAME);
CodeSite.Send('TForm1.GetControlPanelItems: szDisplayName', FileInfo.szDisplayName);
// Exe-Info:
ZeroMemory(@ShExeInfo, SizeOf(ShExeInfo));
ShExeInfo.cbSize := SizeOf(ShExeInfo);
ShExeInfo.lpVerb := 'Open';
// control panel item's PIDL:
ShExeInfo.lpIDList := pidAbsolute;
ShExeInfo.nShow := SW_SHOWNORMAL;
ShExeInfo.fMask := SEE_MASK_IDLIST;
//ShExeInfo.lpFile := ???
//ShExeInfo.lpDirectory := ???
CodeSite.Send('TForm1.GetControlPanelItems: ShExeInfo.lpFile', ShExeInfo.lpFile);
CodeSite.Send('TForm1.GetControlPanelItems: ShExeInfo.lpDirectory', ShExeInfo.lpDirectory);
end;
end;
end.
这让我得到控制面板的显示名称。
但是我怎样才能得到文件路径呢? (ShExeInfo.lpDirectory, SheExeInfo.lpFile)
【问题讨论】:
-
AFAIK,你不能。并非所有控制面板项目都是可执行文件。许多都是使用
rundll32.exe运行的,不能直接独立执行。 -
此外,一个可执行文件还可以包含多个控制面板小程序。
-
我们的根本问题是什么。我猜你对知道他们的名字不感兴趣。你想调用它们吗?
-
每个小程序不一定有文件名。所以你所要求的无法实现。
-
有 5 个反对票。连我都没有那么大的权力。我正在回复您坚持使用文件名的评论。我猜你现在意识到你在这方面是错误的。
标签: delphi delphi-10.1-berlin control-panel