Mam pytanie jak założyć hoka globalnego w delphi na klawiaturę po wciśnięciu Ctrl + Alt + Delete. Chodzi mi o to jak wcisnę powyższą kombinację klawiatury ma wykonać się odpowiednia procedura. Z tego co wiem jest to kombinacja wyjątkowa systemowa i ciężko ją przechwycić.
Można wykryć naciśnięcie tych klawiszy, ale nie można przechwycić samego naciśnięcia tak by nie dotarło do systemu. System i tak wykona to co normalnie wykonuje po naciśnięciu Ctrl+Alt+Delete.
Nawet VMWare czy Virtual Box które mocno grzebią w systemie nie są w stanie przechwycić tego skrótu.
A może przechwycić było by lepiej okno z wyświetleniem komunikatu:
Zablokuj ten komputer
Przełącz użytkownika
Wyloguj
Zmień hasło
Uruchom Menadżera zadań
Może wie ktoś jak?
Azarien dotrzeć do systemu mogą. Chodzi mi o równoległe przechwycenie tego skrótu dla potrzeb mojego programu. Hok może być w dll.
Brunatny Polityk napisał(a):
A może przechwycić było by lepiej okno z wyświetleniem komunikatu:
Zablokuj ten komputer
Przełącz użytkownika
Wyloguj
Zmień hasło
Uruchom Menadżera zadańMoże wie ktoś jak?
A to okno nie tworzy jakiegoś nowego procesu? pytam, bo nie idzie mi sprawdzenie tego :P
#Edit
Chyba mam ten process ;)
Wynik:
LogonUI.exe
cmd.exe 5100 Console 2 3˙172 KB
conhost.exe 4728 Console 2 5˙472 KB
LogonUI.exe 5312 Console 2 22˙312 KB <----
tasklist.exe 3084 Console 2 6˙176 KB
Żeby go wyciągnąć zapisz jako .bat
ping 127.0.0.1 -n 6 > nul
cls
tasklist > C:\tasklist.txt
Odpal plik, szybko kliknij ctrl+alt+del (to okno), poczekaj 7sec i dopiero wtedy je zamknij.
Skopiuj gdzieś zawartość i zrób to samo, tylko, że bez ctrl+alt+del. Następnie po prostu porównaj zawartości
Musisz pobrać listę procesów i sprawdzić czy istnieje LogonUI.exe
Nie wiem jak w delphi, ale w c# się to dość prosto robi. Jednakże, gdybyś miał z tym problem, to zrób po prostu
tasklist > C:\tasklist.txt
i z pliku odczytaj albo sprawdź czy string.contains
Oki poradziłem sobie wystarczyło przechwycić WTS_SESSION_LOGOFF
WeiXiao z tym LogonUI.exe mialeś rację dzieki
procedure TForm1.Timer1Timer(Sender: TObject);
var
HWND : THandle;
Proc : TProcessEntry32;
i : integer;
begin
ListBox1.Clear;
HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
Proc.dwSize := SizeOf(Proc);
if Integer(Process32First(HWND, Proc)) <> 0 then
repeat
if pos('LogonUI.exe',Proc.szExeFile) > 0 then
ListBox1.Items.Add(Proc.szExeFile);
until Integer(Process32Next(HWND, Proc)) = 0;
CloseHandle(HWND);
end;
Po co rzutujesz rezultat funkcji Process32First i Process32Next na liczbę, skoro te funkcje zwracają wartość logiczną? Niepotrzebnie zaciemniasz kod.
Brunatny Polityk napisał(a):
Oki poradziłem sobie wystarczyło przechwycić WTS_SESSION_LOGOFF
WeiXiao z tym LogonUI.exe mialeś rację dzieki
procedure TForm1.Timer1Timer(Sender: TObject); var HWND : THandle; Proc : TProcessEntry32; i : integer; begin ListBox1.Clear; HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0); Proc.dwSize := SizeOf(Proc); if Integer(Process32First(HWND, Proc)) <> 0 then repeat if pos('LogonUI.exe',Proc.szExeFile) > 0 then ListBox1.Items.Add(Proc.szExeFile); until Integer(Process32Next(HWND, Proc)) = 0; CloseHandle(HWND); end;
Hej, jakby coś, to pamiętaj, że (jeśli dobrze pamiętam) to LogonUI odpala się również przy starcie i zamykaniu systemu (i znając życie pewnie przy czymś tam jeszcze (może przelogowanie?))
tak "w razie w" żeby cię jakieś dziwne bugi nie męczyły :D