Возникла задача - перехват программой нажатия клавиши SLEEP.
Поскольку ни в книжках, что есть у меня, ни в справке Делфи нет кода клавиш управления питанием, то написал такую программульку, чтобы этот код узнать:
http://slil.ru/25238047 Привожу фрагмент программы.
type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
var buf: TKeyboardState; i: word; L: longbool; P: string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption:=''; GetKeyboardState(buf); L:=false; P:=''; for i:=2 to 255 do begin if buf[i]=1 then begin if L then P:=' + '; Label1.Caption:=Label1.Caption+P+inttostr(i); L:=true; buf[i]:=0 end; end; SetKeyboardState(buf) end;
procedure TForm1.FormActivate(Sender: TObject); begin for i:=0 to 255 do buf[i]:=0; SetKeyboardState(buf) end;
end.
Запуская её на работе на 3-х машинах, узнал, что power и wake соответствует один и тот же код 255, sleep - 95.
Радостно потирая руки и надувая щёки , я пришёл домой с намерением отполировать программу.
Включаю ЭВМ, а моя программа вообще не реагирует на эти клавиши!!! Не знаю, в какой бубен бить.
Просьба запустить приложенную программку у себя на машинах (намеренно дал исходный код, чтоб не было подозрений насчёт троянов) на предмет высвечивания кода клавиш питания.
Инструкция:
- назначить через панель управления клавишам питания режим "не выполнять никаких действий", дабы не смущать систему;
- запустить программу;
- нажать клавишу питания;
- нажать кнопу программы.
Результат, если не трудно, сообщите.
ЗЫ: На работе на 2-х машинах XP SP2, на 3-й - Виста, ставленная с того же дистрибутива, что и дома.
ЗЫЗЫ: Самое интересное, что ОС реагирует на клавиши питания как положено.
Отладил сейчас программку, могу задать выключение по любой клавише. Кроме SLEEP и POWER на домашнем компе. Приложенный пример настроен на выключение по клавише PAUSE/BREAK как неиспользуемой мною. Может, кому пригодится.
Код:
program Project2;
uses Windows, Forms;
var tkh: THandle; tp: TTokenPrivileges;
begin
Application.Run; GetAsyncKeyState(19); while (GetAsyncKeyState(19) and 1)=0 do sleep(1000); if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, tkh) then if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid) then begin tp.PrivilegeCount:=1; tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; If AdjustTokenPrivileges(tkh, false, tp, 0, nil, PDword(nil)^) then ExitWindowsEx(EWX_SHUTDOWN,0) end end.
Сигнал SLEEP, сформированный клавиатурой, подключенной по USB, мне не удалось перехватить, ту же клавиатуру подключил через переходник по PS/2, и всё пошло как по маслу. Во как!
Member
Статус: Не в сети Регистрация: 16.04.2004 Откуда: [MSK.RU]
MrGalaxy Покури Win32 SDK на предмет хуков. Посмотри функцию SetWindowsHookEx.
С помощью одного только этого мануала мне удалось написать кейлоггер для курсача... Он ловит вообще всё.
Правда, писал на С++, ну да это мелочи...
Member
Статус: Не в сети Регистрация: 16.04.2004 Откуда: [MSK.RU]
MrGalaxy А фиг её знает... У меня нет ни одной USB-клавиатуры...
Можно попробовать: http://cp.people.overclockers.ru/cgi-bi ... ame=hk.rar Распаковывается в какую-то папочку, запускается единственный экзешник. Сверху где-то появляется полупрозрачное окошко.
Жмёте на кнопочки какие надо несколько раз, жмёте крестик на этом полупрозрачном окошке - и оно закрывается.
В папке появится пара файликов. CSV со статистикой и TXT со списком нажатых клавиш...
Tod Schwarzkaiser За ссылку респект, попробую декомпилировать её на досуге.
Цитата:
нет ни одной USB-клавиатуры
Самый и смысл в этом. Моя программа тоже ловит все клавиши, но только если клава подключена к PS/2.
Я думаю, те, кто писал драйвер для USB-клавиатуры, посчитал, что пользователю клавиши питания не нужны, и дальше системы их не пустил.
Не хотелось эту программу запускать у себя, хотел только декомпилировать и написать на её основе что-то своё (если понравится), но что не сделаешь ради науки.
Докладываю. Распаковал, запустил от имени администратора, она стартовала - и всё. Висит в диспетчере задач, никакого окна не появилось. Перезагрузился, опять стартовал, опять ничего. То ли она под Вистой неуютно себя чувствует, то ли под 64-битной системой, в общем, не получилось оценить её.
Member
Статус: Не в сети Регистрация: 16.04.2004 Откуда: [MSK.RU]
MrGalaxy Под вистой её никто до этого не проверял Более того, когда она писалась, Висты ещё не было
ЗЫ. Окошко там совсем небольшое и полупрозрачное, это делалось для того, чтобы не отвлекать испытуемых. Может быть, его просто не видно? Попробуйте на белом фоне Смех смехом, а кто его знает, может быть поможет...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения