Uruchomienie appletu Panelu Sterowania

Marcin Baszczewski

Aby programowo uruchomić wybrany aplet z Panelu Sterowania, można użyć poniższej funkcji:

function UruchomApplet(const Applet:string):integer;
begin
result:=ShellExecute(
    GetDesktopWindow(),
    nil,
    'rundll32.exe',
    PChar('shell32.dll,Control_RunDLL '+Applet),
    nil,
    SW_SHOWNORMAL
    );
end;

Przykładowe użycie, uruchamiające aplet Ekran, przedstawia poniższe wywołanie:

UruchomApplet('desk.cpl');

Jako komentarz warto przedstawić inne rozwiązanie, które może potencjalnie działać. 'Potencjalnie' ponieważ jego działanie jest zależne od wersji zainstalowanego systemu oraz dodatków.

Najbardziej intuicyjną formą wywołania apletu przez ShellExecute może być podanie od razu nazwy apletu jako wykonywanej aplikacji oraz akcji 'open'. Niestety, nawet w najnowszych systemach może nie działać, ponieważ z plikami (*.cpl) związany jest typ klasy plików (cplfile), który ma różnie nazwaną akcję otwierającą. Choć standardowo jest to akcja 'open', niektóre systemy, na przykład Windows MCE, mogą mieć akcję nazwaną 'cplopen'. Dopiero zmiana nazwy akcji pozwala wtedy na prawidłowe działanie funkcji na innym systemie. Jest to niestety funkcja nieprzenośna między systemami.

Rozwiązaniem tego problemu może być podanie nil jako nazwy akcji, a więc użycie akcji domyślnej. Sytuację taką pokazuje poniższy kod. Wszystko powinno działać dobrze, póki w systemie nie zostanie zainstalowane jakieś narzędzie, dodające nowe akcje skojarzone z plikami (*.cpl). Jest to rzadka sytuacja, nie mniej jednak może wystąpić. Wtedy, zależnie od nazwy dodanej akcji, wywołana zostanie akcja otwierająca, albo któraś z dodanych.

function UruchomApplet(const Applet:string):integer;
begin
result:=ShellExecute(
    GetDesktopWindow(),
    nil,
    PChar(Applet),
    nil,
    nil,
    SW_SHOWNORMAL
    );
end;

Podsumowując: choć istnieją łatwiejsze metody wywołania apletu, najbardziej uniwersalną i przenośną jest wywołanie apletu przez aplikację rundll32.exe, ponieważ domyślną akcją dla plików wykonywalnych jest zawsze uruchomienie, natomiast dla plików bibliotek - w tym przypadku (*.cpl) - akcja domyślna może się zmieniać zależnie od systemu.

Standardowe aplety systemu przedstawia poniższe tabela:

Plik Nazwa
access.cpl Opcje ułatwień dostępu
appwiz.cpl Dodaj lub usuń programy
desk.cpl Ekran
firewall.cpl Zapora systemu Windows
hdwwiz.cpl Dodaj sprzęt
inetcpl.cpl Opcje internetowe
intl.cpl Opcje regionalne i językowe
joy.cpl Kontrolery gier
main.cpl Mysz
mmsys.cpl Dźwięki i urządzenia audio
ncpa.cpl Połączenia sieciowe
netsetup.cpl Kreator konfiguracji sieci
nusrmgr.cpl Konta użytkowników
powercfg.cpl Opcje zasilania
sysdm.cpl System
telephon.cpl Opcje telefonu i modemu
timedate.cpl Data i godzina
wscui.cpl Centrum zabezpieczeń
wuaucpl.cpl Aktualizacje automatyczne

Domyślnie biblioteki apletów - pliki (*.cpl) - znajdują się w katalogu %WINDIR%\System32 (czyli np.: C:\Windows\System32).

Nazwa i komentarz oraz ikona apletu są pobierane z biblioteki apletu. Opis tworzenia apletów oraz samej ich budowy można znaleźć w artykule: Aplet w oknie Panel sterowania.

Warto również zaznaczyć, że nie wszystkie obiekty w Panelu Sterowania są apletami. Opcje takie jak obiekt Czcionki, czy też Narzędzia administracyjne są zdefiniowane za pomocą rejestru i nie wymagają klasycznych plików (*.cpl). Tworzenie takich obiektów opisuje porada: Ikona w oknie Mój komputer i innych folderach specjalnych.

4 komentarzy

Dzięki za poprawki :-)
Sam nieujal bym tego lepiej ;-)

tak wogóle to wystarczy wpisać do procedury:
ShellExecute(0, 'open', 'Joy.cpl', nil, nil, SW_SHOWNORMAL)
i gotowe po wykonaniu polecenia zobaczymy ustawienia dżojstików

lista apletów:
Access.cpl, Appwiz.cpl, Desk.cpl, Inetcpl.cpl, Intl.cpl, Joy.cpl, Main.cpl, Mmsys.cpl, Modem.cpl, Netcpl.cpl, Odbccp32.cpl, Password.cpl, Sysdm.cpl, Themes.cpl, timedate.cpl, Wgpocpl.cpl (wymaga M$ Office)

Dwa szczegóły: Nie C:\Windows\System32 tylko %WINDIR%\system32, gdzie %WINDIR% to zmienna środowiskowa jaką moża łatwo uzyskać.

Po drugie, używanie WinExec nie jest zalecane, lepiej użyć ShellExecute. WinExec jest przestarzałe i może zostać usunięte, bo obecnie to trzymają tylko w celach kompatybilności.