Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перехватить Scroll Lock, События клавиатуры 
:(
    Опции темы
lider07
Дата 3.7.2003, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 11.6.2003
Где: Бишкек

Репутация: нет
Всего: нет



Цитата
Или можно тогда Хуком - для етого форма и ненужна

А вот саит где можно глянуть на хороший хук ;-)http://www.sources.ru/delphi/delphi_introduction_to_hook_procedures.shtm l
PM MAIL ICQ MSN   Вверх
Akella
Дата 4.7.2003, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Я нашел решение для хука, только вот русские символы неправильно выводятся в MEMO, прийдется еще доработать.
В этом модуле кроме сохранения всех нажатых клавиш (букв) проверяется нажатие Scroll Lock и если он включен, то русская раскладка иначе английская. Это удобно если кроме английской и русской раскладки установлена, ну например украинская. Переключение минуя украинскую.
Но это еще плохо проверено, поэтому буду орабатывать. Ну а если кто что-нибудь подскажет буду искренне рад. Заранее благодарен.
Еще осталось прятать программу при запуске.
Выше Mikel предложил ссылку на FAQ с использованием DLL, но у меня, честно говоря, не получилось. Хотя оба проекта нормально откомпелировались (под WinXP в Delphi6)


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TfmMain = class(TForm)
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
Memo1: TMemo;
Edit1: TEdit;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure SetKey(Key:Integer);
procedure ChKeyb;

// procedure wmScrollLock(var Mes: TWMKeydown); message wm_keydown;
public
{ Public declarations }
end;

var
fmMain: TfmMain;

HookHandle: hHook;

implementation

{$R *.dfm}

procedure TfmMain.SetKey(Key:Integer);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

Procedure TfmMain.ChKeyb;
var
Layout: array[0.. KL_NAMELENGTH] of char;
begin//если включен Scroll Lock, то включаем русскую раскладку
//иначе английскую
if GetKeyState(vk_scroll)=0 then
LoadKeyboardLayout( StrCopy(Layout,'00000419'),KLF_ACTIVATE) // русская
else
LoadKeyboardLayout(StrCopy(Layout,'00000409'),KLF_ACTIVATE) // английская
end;


function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
key: integer;
vLine: String;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with fmMain do
case msg.message of
WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
WM_LBUTTONDOWN: CheckBox1.Checked := true;
WM_LBUTTONUP: CheckBox1.Checked := false;
WM_RBUTTONDOWN: CheckBox2.Checked := true;
WM_RBUTTONUP: CheckBox2.Checked := false;
WM_KEYUP: CheckBox3.Checked := false;
WM_KEYDOWN: begin
CheckBox3.Checked := true;
key := msg.paramL and 255;
// if key in [48..57, 65..90] then begin
if key in [0..255] then begin
if (key=VK_SCROLL) then begin
key:=0;
ChKeyb;
end;//if vk_skroll
Edit1.Text:=Edit1.Text+chr(key);
if (key=vk_return) then begin
Memo1.Lines.Add(DateTimeToStr(now)+' * '+Edit1.Text);
// Memo1.Lines.Add(chr(key));
Edit1.Text:='';
end;//if (key=vk_return)
end;//if key in...}
end;
end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;


procedure TfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
Var
S:String;
I:Integer;
begin
if HookHandle > 0 then
UnhookWindowsHookEx(HookHandle);
S:=DateTimeToStr(now);
For I:=0 to Length(s) do begin
if S[i]=':' then s[i]:='-';
end;//for
Memo1.Lines.SaveToFile(s+' '+'hook.txt');
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
fmMain.FormStyle := fsStayOnTop;
CheckBox1.Enabled := false;
CheckBox1.Caption := 'left button';
CheckBox2.Enabled := false;
CheckBox2.Caption := 'right button';
CheckBox3.Enabled := false;
CheckBox3.Caption := 'keyboard';
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
// Memo1.Lines.Add('');
Memo1.Enabled := false;
Edit1.Enabled:=False;
end;

end.

PM MAIL   Вверх
Akella
Дата 4.7.2003, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата
IF (Key=ScrollLock) and (ssAlt in Shift) then key:=0;
Это вроде бы как отключает ALt+ScrollLock(в OnKeyDown/OnKeyPressed/OnKeyUp). Но очень сомнительно, что это заработает


а зачем отключать такую комбинацию. И вообще что происходит при нажатии такой комбинации (если это стандартная комбинация, типа Alt+Tab)?
PM MAIL   Вверх
lider07
Дата 4.7.2003, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 11.6.2003
Где: Бишкек

Репутация: нет
Всего: нет



Цитата
Еще осталось прятать программу при запуске.

если с таксбара то вот на кодик showwindow(Application.handle,sw_hide);

PM MAIL ICQ MSN   Вверх
Akella
Дата 6.7.2003, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата
если с таксбара то вот на кодик showwindow(Application.handle,sw_hide)

это я и сам знаю, но в WinXP прятать программу от юзеров, которые возомнили,. что они крутые хакеры не так просто.
PM MAIL   Вверх
Pakshin A. S.
Дата 11.7.2003, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



К вопросу про Scroll Lock:
Можно поставить таймер с интервалом в 1 или цикл с Application.ProcessMessages, куда запихнуть следующее:
Код

(*---*)
var
KS: TKeyboardState;
(*---*)
begin
(*---*)
if Odd(GetKeyState(VK_SCROLL))
 then
  begin
   (*Нажато*)
   (*Что-то делаем*)
   (*Например выключаем её*)
   GetKeyboardState(KS);
   KS[VC_SCROLL]:=KS[VC_SCROLL] AND (NOT 1);
   SetKeyboardState(KS);
   (*---*)
  end;
(*---*)
end;

PM   Вверх
Akella
Дата 23.7.2003, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Еще есть проблема, при деактивации (сворачивании) прога виснет.
И еще, при выводе в TMemo нажимаемых клавиш, выводятся только литинские символы, даже если переключена раскладка на русский.

Это сообщение отредактировал(а) dsergey - 29.7.2003, 15:40
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.