1

1.コントロールパネルの名前とアイコンを含むリストを取得して、[スタート]メニューに表示されるようなメニューを作成するにはどうすればよいですか?

スタートメニューからのコントロールパネルのフライアウト

2.エントリをクリックしたときに、対応するコントロールパネルを実行するにはどうすればよいですか?

ちなみに、この種のPopupMenuを実行するために使用されるコントロールは何ですか?ただし、右クリックイベントがあります。

アップデート :

PItemIDListを使用してフォルダーを取得します。

var:
PIDL, TempPIDL: PItemIDList;
Path: array[0..MAX_PATH] of Char;
FI: SHFILEINFOW;
begin
SHGetSpecialFolderLocation(0, CSIDL_FAVORITES, PIDL);
SHGetPathFromIDList(PIDL , Path);
Memo1.Lines.Add(Path);
SHGetFileInfo(LPCTSTR(PIDL), 0, FI, SizeOf(FI), SHGFI_PIDL or SHGFI_DISPLAYNAME or SHGFI_ICON);
Memo1.Lines.Add(FI.szDisplayName);
Image1.Picture.Icon.Handle := FI.hIcon;

正常に表示されますが、CSIDL_FAVORITEをCSIDL_CONTROLSに変更すると、常にエラーが発生します。これは、コントロールパネルのアイテムを取得するための間違った方法ですか?こちらからCPLコピーを使用して別の方法も使用し
ていますが、完全なアイテムを表示することはできません。

4

4 に答える 4

3

登録されているすべてのアプレットのレジストリを確認できます。
これらを登録する方法について説明します。http://msdn.microsoft.com/en-us/library/windows/desktop/bb757044.aspx
同様に、レジストリをスキャンして、すでに登録されているアプレットとその実行方法を確認できます。

ただし、64ビットウィンドウでは、32ビットアプリケーションがロードできない64ビットアプレットが存在するため、アイコンを抽出するのは面倒な場合があります。LoadLibraryExただし、単なるアイコン抽出のために64ビットDLLを介してAsResourceLibraryフラグを使用して呼び出すことができるかどうかはわかりません。


別のアプローチは、Windowsエクスプローラーの名前空間を使用することです。などではなく、などのShell仮想パスを開くことを提供するコンポーネントスイートを入手してください。コントロールパネルには特別なGUIDがあります(私はその権利を覚えていません。しかし、ツールはそのGUIDを使用して任意のフォルダーにコントロールパネルを作成できます)。おそらく、シェルUIを使用して、ある種の特別な仮想フォルダーを開き、アイテムを列挙して対応する画像を抽出し、メニューとして再配置することができます。次に、そのシェルリストビューのアイテムをダブルクリックして実行する可能性があります。My ComputerMy Documentsc:\Microsoft TweakUIControl PanelListView

于 2012-10-24T11:18:26.617 に答える
2

コントロールパネルアプレットは、システムフォルダにあるCPLファイルです。

例:C:\ Windows \ system32

私の提案は、それらのファイルを一覧表示してから、アイコンを抽出してファイル名を取得することです。

コードに問題がある場合は、ここに投稿してください。

CPLファイルは単なるDLLファイルであり、複数のアプレットを含めることができます

グーグル検索の後、私はこのチュートリアルを見つけました:

http://delphi.about.com/od/kbwinshell/l/aa062403a.htm

于 2012-10-24T09:28:31.997 に答える
2

あなたの助けで、私は問題を解決しました!DavidHeffernanに感謝します

1.コントロールパネルの項目を取得するWindowsシェルを使用してコントロールパネルの項目を取得します。CPLファイルを使用すると完全な項目は取得されません。

コード:

var
  psfDeskTop: IShellFolder;
  psfControl: IShellFolder;

  pidControl: PITEMIDLIST;
  pidChild: PITEMIDLIST;
  pidAbsolute: PItemIdList;

  pEnumList: IEnumIDList;
  celtFetched: ULONG;

  FileInfo: SHFILEINFOW;

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);
   // SHGetFileInfo can get name and icon 
   //Do something to save item name and icon

  end;

2. ExecuteShellExecuteExは、PIDLアイテムを実行するため に使用する必要があります。

var 
ShExeInfo : SHELLEXECUTEINFO;

begin

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;
end

と使用

 ShellExecuteEx(@ShExeInfo);

最後に、DavidHeffernanにもう一度感謝します。私を大いに助けてください。

于 2012-11-04T10:25:54.567 に答える
0

アリオクの提案に続いて'

参照: http: //www.geoffchappell.com/studies/windows/shell/shell32/classes/controlpanel.htm

私が考えていた他の「2つまたは3つの方法」はそこで詳しく説明されています。

CONTROL.INIファイルの[MMCPL]セクションは、現在、レジストリキーHKEY_CURRENT_USER \ Control Panel\MMCPLにマップされています。

レジストリキーHKEY_CURRENT_USER\Software \ Microsoft \ Windows \ CurrentVersion \ Control Panel \ CPLs;

また、そこにも詳細なリストをロードしないでください:

候補のCPLモジュールは、そのファイル名が次のレジストリキーのいずれかに値として表示されている場合、拒否されます。

HKEY_CURRENT_USER\Control Panel\don't load
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Control Panel\don't load

言われたように、このプロジェクトの課題は、すべての適切な場所を一掃し、それに基づいて行動できるように正しい方法でデータを取得することです。これは、いくつかの「新しい」デザインコントロールパネルアイテム(およびそこに表示されるシェルフォルダー、それらにアクセスする方法をまだ発見したかどうかはわかりません)がどのように表示されるかによるものです。私は手元にあるデータを持っていませんが、それが議論をさらに進めるのであれば、例を1つか2つコピーすることができます。

于 2012-10-25T22:30:25.357 に答える