Вопрос по Delphi

Форум для программистов

Сообщение Ti-Mac » Пн май 17, 2004 9:24 am

Имеется следующий алгоритм:

1) Перехватываем нажатую клавишу (глобально)
2) Если это, например, стрелка влево, то блокируем её и эмулируем нажатие стрелки вправо
3) Точно также делаем со стрелками вверх\вниз

Как осуществить этот прикол? (Народ!, пишите пожалуйста с комментариями. Спасибо!)
<span style='color:blue'>Formating C: .................98%</span>
<span style='color:red'>Fatal Error:</span> <span style='color:blue'>found Windows</span>
Ti-Mac
Капитан
 
Сообщений: 168
Зарегистрирован: Вс апр 18, 2004 8:18 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение sm@rt » Пн май 17, 2004 2:44 pm

Используй hook-и.
Покопай на эту тему [hooks] на королевстве Дельфи и на delphimastak.ru или ещё где. Инфы куча. С примерами и т.п.
Красота и массовые расстрелы спасут мир.
sm@rt
Генерал-майор
 
Сообщений: 2935
Зарегистрирован: Вт фев 25, 2003 4:42 pm
Пункты репутации: 0

Сообщение Spike » Ср май 19, 2004 12:10 am

и с dll изнутри познакомишься заодно
<!--coloro:blue--><span style="color:blue"><!--/coloro--><a href="http://www.foobar2000.ru/" target="_blank">www.foobar2000.ru - все о любимом аудиоплеере.</a><!--colorc--></span><!--/colorc-->
RUSnet #foobar2000 #miranda.
<a href="http://www.foobar2000.ru/" target="_blank">Изображение</a>

<!--coloro:red--><span style="color:red"><!--/coloro-->Даша, я люблю тебя!<!--colorc--></span><!--/colorc-->
Spike
Генерал-лейтенант
 
Сообщений: 3036
Зарегистрирован: Вт мар 18, 2003 7:34 am
Откуда: Ачинск, Красноярский край
Пункты репутации: 0

Сообщение Spike » Ср май 19, 2004 1:33 am

Может поможет этот пример

<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->
Перехват (Hook) клавиатуры (программа Sendkeys) 
--------------------------------------------------------------------------------

Автор: Bogachev 

program Project1;

uses
  Forms,
  Unit1 in '..\Hooks1\Unit1.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //

library SendKey;

uses

  SysUtils, Classes, Windows, Messages;

const

  {пользовательские сообщения}
  wm_LeftShow_Event = wm_User + 133;
  wm_RightShow_Event = wm_User + 134;
  wm_UpShow_Event = wm_User + 135;
  wm_DownShow_Event = wm_User + 136;

  {handle для ловушки}
  HookHandle: hHook = 0;

var

  SaveExitProc: Pointer;

  {собственно ловушка}

function Key_Hook(Code: integer; wParam: word;
  lParam: Longint): Longint; stdcall; export;
var
  H: HWND;
begin

  {если Code>=0, то ловушка может обработать событие}
  if (Code >= 0) and (lParam and $40000000 = 0) then
  begin
    {ищем окно по имени класса и по заголовку
    (Caption формы управляющей программы должен быть равен 'XXX' !!!!)}
    H := FindWindow('TForm1', 'XXX');

    {это те клавиши?}
    case wParam of
      VK_Left: SendMessage(H, wm_LeftShow_Event, 0, 0);
      VK_Right: SendMessage(H, wm_RightShow_Event, 0, 0);
      VK_Up: SendMessage(H, wm_UpShow_Event, 0, 0);
      VK_Down: SendMessage(H, wm_DownShow_Event, 0, 0);
    end;
    {если 0, то система должна дальше обработать это событие}
    {если 1 - нет}
    Result := 0;
  end

  else if Code < 0 {если Code<0, то нужно вызвать следующую ловушку} then
    Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

{при выгрузке DLL надо снять ловушку}

procedure LocalExitProc; far;
begin

  if HookHandle <> 0 then
  begin
    UnhookWindowsHookEx(HookHandle);
    ExitProc := SaveExitProc;
  end;
end;

exports Key_Hook;

{инициализация DLL при загрузке ее в память}
begin
  {устанавливаем ловушку}

  HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook,
    hInstance, 0);
  if HookHandle = 0 then
    MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)
  else
  begin
    SaveExitProc := ExitProc;
    ExitProc := @LocalExitProc;
  end;
end.

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //

object Form1: TForm1
  Left = 200
    Top = 104
    Width = 544
    Height = 375
    Caption = 'XXX'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    PixelsPerInch = 96
    TextHeight = 13
    object Label1: TLabel
    Left = 128
      Top = 68
      Width = 32
      Height = 13
      Caption = 'Label1'
  end
end

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //

unit Unit1;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls;

{пользовательские сообщения}

const

  wm_LeftShow_Event = wm_User + 133;
  wm_RightShow_Event = wm_User + 134;
  wm_UpShow_Event = wm_User + 135;
  wm_DownShow_Event = wm_User + 136;

type

  TForm1 = class(TForm)
    Label1: TLabel;

    procedure FormCreate(Sender: TObject);

  private //Обработчики сообщений

    procedure WM_LeftMSG(var M: TMessage);
      message wm_LeftShow_Event;

    procedure WM_RightMSG(var M: TMessage);
      message wm_RightShow_Event;

    procedure WM_UpMSG(var M: TMessage);
      message wm_UpShow_Event;

    procedure WM_DownMSG(var M: TMessage);
      message wm_DownShow_Event;
  end;

var

  Form1: TForm1;
  P: Pointer;

implementation

{$R *.DFM}

//Загрузка DLL

function Key_Hook(Code: integer; wParam: word;
  lParam: Longint): Longint; stdcall; external 'SendKey' name 'Key_Hook';

procedure TForm1.WM_LefttMSG(var M: TMessage);
begin

  Label1.Caption := 'Left';
end;

procedure TForm1.WM_RightMSG(var M: TMessage);
begin

  Label1.Caption := 'Right';
end;

procedure TForm1.WM_UptMSG(var M: TMessage);
begin

  Label1.Caption := 'Up';
end;

procedure TForm1.WM_DownMSG(var M: TMessage);
begin

  Label1.Caption := 'Down';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  {если не использовать вызов процедуры из DLL в программе,
  то компилятор удалит загрузку DLL из программы}
  P := @Key_Hook;
end;

end.

 
Проект Delphi World © Выпуск 2002 - 2003
Автор проекта: ___Nikolay

<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->
<!--coloro:blue--><span style="color:blue"><!--/coloro--><a href="http://www.foobar2000.ru/" target="_blank">www.foobar2000.ru - все о любимом аудиоплеере.</a><!--colorc--></span><!--/colorc-->
RUSnet #foobar2000 #miranda.
<a href="http://www.foobar2000.ru/" target="_blank">Изображение</a>

<!--coloro:red--><span style="color:red"><!--/coloro-->Даша, я люблю тебя!<!--colorc--></span><!--/colorc-->
Spike
Генерал-лейтенант
 
Сообщений: 3036
Зарегистрирован: Вт мар 18, 2003 7:34 am
Откуда: Ачинск, Красноярский край
Пункты репутации: 0

Сообщение Ti-Mac » Ср май 19, 2004 2:07 am

2Spike Lee
Нихрена себе, щас буду разгребать!
<span style='color:blue'>Formating C: .................98%</span>
<span style='color:red'>Fatal Error:</span> <span style='color:blue'>found Windows</span>
Ti-Mac
Капитан
 
Сообщений: 168
Зарегистрирован: Вс апр 18, 2004 8:18 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение Spike » Ср май 19, 2004 2:09 am

2Ti-Mac
греби :)
если надо будет, подкину еще
<!--coloro:blue--><span style="color:blue"><!--/coloro--><a href="http://www.foobar2000.ru/" target="_blank">www.foobar2000.ru - все о любимом аудиоплеере.</a><!--colorc--></span><!--/colorc-->
RUSnet #foobar2000 #miranda.
<a href="http://www.foobar2000.ru/" target="_blank">Изображение</a>

<!--coloro:red--><span style="color:red"><!--/coloro-->Даша, я люблю тебя!<!--colorc--></span><!--/colorc-->
Spike
Генерал-лейтенант
 
Сообщений: 3036
Зарегистрирован: Вт мар 18, 2003 7:34 am
Откуда: Ачинск, Красноярский край
Пункты репутации: 0

Сообщение Ti-Mac » Ср май 19, 2004 3:57 am

<!--QuoteBegin--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Цитата </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->
object Form1: TForm1
  Left = 200
    Top = 104
    Width = 544
    Height = 375
    Caption = 'XXX'
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    PixelsPerInch = 96
    TextHeight = 13
    object Label1: TLabel
    Left = 128
      Top = 68
      Width = 32
      Height = 13
      Caption = 'Label1'
  end
end
<!--QuoteEnd--></td></tr></table><div class='postcolor'><!--QuoteEEnd-->
А это куда писать? (формы та нет...)
Если что-то нето сказал, то просьба камнями не кидаться - я новичок :)
<span style='color:blue'>Formating C: .................98%</span>
<span style='color:red'>Fatal Error:</span> <span style='color:blue'>found Windows</span>
Ti-Mac
Капитан
 
Сообщений: 168
Зарегистрирован: Вс апр 18, 2004 8:18 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение Spike » Ср май 19, 2004 4:27 am

2Ti-Mac
создаешь новую форму
помещаешь на нее label
это просто демо для dll
caption у label будет меняца как ты будешь жать кнопки
<!--coloro:blue--><span style="color:blue"><!--/coloro--><a href="http://www.foobar2000.ru/" target="_blank">www.foobar2000.ru - все о любимом аудиоплеере.</a><!--colorc--></span><!--/colorc-->
RUSnet #foobar2000 #miranda.
<a href="http://www.foobar2000.ru/" target="_blank">Изображение</a>

<!--coloro:red--><span style="color:red"><!--/coloro-->Даша, я люблю тебя!<!--colorc--></span><!--/colorc-->
Spike
Генерал-лейтенант
 
Сообщений: 3036
Зарегистрирован: Вт мар 18, 2003 7:34 am
Откуда: Ачинск, Красноярский край
Пункты репутации: 0


Вернуться в Программирование

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron