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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посчитать кол-во нажатий пробела, используя hook 
:(
    Опции темы
Олечка85
  Дата 1.8.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем!

Задача такая: я запускаю одну программу из своей и считаю кол-во нажатых пробелов до тех пор, пока эта программа не завершится, потом вывожу кол-во нажатых пробелов на экран.

И проблемка: прослеживаю нажатие пробела с помощью хука, с dll. Там же считаются нажатые пробелы. 

КАК ПЕРЕДАТЬ КОЛ-ВО ПРОБЕЛОВ В ОСНОВНУЮ ПРОГРАММУ???

код библиотеки:

Код

library library_podcasts;

uses
  SysUtils,
  Classes,
  Windows;

var
MyHookHandle : HHook = 0;
Count : integer = 0;
resultat : integer = 0;

{$R *.res}

function MyCoolHook(Code : integer; wParam : word; lParam : Longint) : LongInt; stdCall;
    begin
        if code<0 then Result := CallNextHookEx(MyHookHandle,Code, wParam, lParam)
        else
            begin
            result := 0;
            if wParam = VK_Space then
                begin
                  Inc(Count);
                  if Count > 0 then Inc(resultat);
              end;
            CallNextHookEx(MyHookHandle,Code, wParam, lParam)
        end;{if}

    end;

  {===========================}

procedure SetHook;stdCall;Export;
    begin
    MyHookHandle := SetWindowsHookEx(WH_Keyboard, @MyCoolHook, hInstance, 0);
    end;

{===========================}

procedure UnHook;stdCall;Export;
    begin
    UnhookWindowsHookEx(MyHookHandle);
  resultat := count;
    end;

{===========================}

exports
    SetHook,
    Unhook;
  
begin
  SetHook;
end.

 

код проги:

 
Код

 ...
  public
  resultat : integer;
    { Public declarations }
  ...


implementation

procedure SetHook; stdCall; external 'library_podcasts.Dll';
procedure UnHook; stdCall; external 'library_podcasts.Dll';

...

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  si: Tstartupinfo;
  p: Tprocessinformation;

begin
  SetHook;
  
  FillChar( Si, SizeOf( Si ) , 0 );
  with Si do
    begin
      cb := SizeOf( Si);
      dwFlags := startf_UseShowWindow;
      wShowWindow := 4;
    end;
  Createprocess('C:\Programme\Microsoft Office\OFFICE11\PPTVIEW.exe', nil , nil, nil,false,  Create_default_error_mode, nil, nil, si, p);
  Waitforsingleobject(p.hProcess, infinite);
  ShowMessage('Programma zavershena');
  Application.MessageBox(Pchar('Vsego probelov = '+ chr(resultat)), 'Vnimanie', MB_SYSTEMMODAL);

  Unhook;
end;

end.



Спасибо заинтересовавшимся!  smile 

Это сообщение отредактировал(а) Олечка85 - 1.8.2006, 16:37
PM MAIL ICQ   Вверх
Snowy
Дата 1.8.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Отправь сообщение. Любое. Например WM_COPYDATA.
PM MAIL   Вверх
Олечка85
Дата 1.8.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Snowy @  1.8.2006,  16:25 Найти цитируемый пост)
Например WM_COPYDATA. 


  
Код

SendMessage(FindWindow(NIL, 'Podcasts_Counter'), WM_COPYDATA, Handle, resultat);


вот так? А в *.dll можно такое писать? На меня дельфи ругается... Может, какие-нибудь библиотеки ещё нужно подключить?


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


Эксперт
****


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

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



Цитата(Олечка85 @  1.8.2006,  16:36 Найти цитируемый пост)
вот так?
Почти.
Только вот так: index.php?showtopic=64589&view=findpost&p=518403

Цитата(Олечка85 @  1.8.2006,  16:36 Найти цитируемый пост)
 А в *.dll можно такое писать?
Конечно. Не вижу никаких ограничений.

Цитата(Олечка85 @  1.8.2006,  16:36 Найти цитируемый пост)
На меня дельфи ругается...
Как ругается? Что говорит?

Цитата(Олечка85 @  1.8.2006,  16:36 Найти цитируемый пост)
Может, какие-нибудь библиотеки ещё нужно подключить?
uses Windows, Messages;

Добавлено @ 17:16 
Если нужно отправить только число, то можно и без WM_COPYDATA
Код
SendMessage(FindWindow(NIL, 'Podcasts_Counter'), WM_USER+100, 0, resultat);

PM MAIL   Вверх
Олечка85
Дата 1.8.2006, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Snowy @  1.8.2006,  17:13 Найти цитируемый пост)
Как ругается? Что говорит?


ругался, что не было библиотеки Messages  smile  Спасибо.

А как обратиться в программе к этому посланному числу? 
Нужно отдельно создавать 
Код

procedure TForm1.WMCopyData 


или что-нибудь подобное или хватит просто присвоить, например , 
Код

Edit1.Text := Pchar(что-нибудь);


??? Если второе, то что именно?

Спасибо, что помогаешь!  smile 

PM MAIL ICQ   Вверх
Alexeis
Дата 1.8.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Олечка85, Вот пример из delphiWorld
Код

// Sender: Send data 
// Sender: Daten schicken 

procedure TForm1.Button1Click(Sender: TObject);
 var
   aCopyData: TCopyDataStruct;
   hTargetWnd: HWND;
 begin
   with aCopyData do
   begin
     dwData := 0;
     cbData := StrLen(PChar(Edit1.Text)) + 1;
     lpData := PChar(Edit1.Text)
   end;
   // Search window by the window title 
  // Fenster anhand des Titelzeilentext suchen 
  hTargetWnd := FindWindowEx(0, 0, nil, PChar('WM_COPYDATA-Receiver'));
   if hTargetWnd <> 0 then
     SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
   else
     ShowMessage('No Recipient found!');
 end;


 (* -------------------------------------------------------------------- *)


 // Recipient - Receive data 
// Empfanger - Daten empfangen 

type
   TForm1 = class(TForm)
     private
     { Private declarations }
     procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
   public
     { Public declarations }
   end;

 procedure TForm1.WMCopyData(var Msg: TWMCopyData);
 var
   sText: array[0..99] of Char;
 begin
   // generate text from parameter 
  // anzuzeigenden Text aus den Parametern generieren 
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
   // write received text 
  // Empfangenen Text ausgeben 
  label1.Caption := sText;
 end;




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 2.8.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Олечка85 @  1.8.2006,  21:47 Найти цитируемый пост)
А как обратиться в программе к этому посланному числу? Нужно отдельно создавать код Pascal/Delphi1:procedure TForm1.WMCopyData highlightSyntax('delphi_Y2ODVm','delphi');highlightSyntax('delphi_Y2ODVm','delphi');или что-нибудь подобное или хватит просто присвоить, например , 
Да нужно. Это ведь событие - пришли данные. Нужно среагировать.
Сами данные никуда не лягут и ниоткуда не возьмутся. Нужно ловить.
Код

  TForm1 = class(TForm)
     .... 
  protected  
    procedure WMCount(var Message: TMessage); message WM_USER + 100; // вот это событие нужно прописать ручками
  end;

.....

implementation

procedure TForm1.WMCount(var Message: TMessage); // и здесь тоже
begin
  Edit1.Text := IntToStr(Message.LParam); // когда сообщение придёт, мы его показываем
end;

PM MAIL   Вверх
Олечка85
Дата 2.8.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Snowy, спасибо! Получается!  smile Только данные как-то нестабильно "ловятся", то правильно кол-во нажатий считается, то - нет...  smile 
Я вызываю ловушку перед тем, как запускаю постороннюю программу, а выключаю ловушку, дождавшись завершения той проги, правильно ведь?  smile 
PM MAIL ICQ   Вверх
Damarus
Дата 2.8.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Я не очень разбираюсь в Delphi, но вот что думаю.
Цитата(Олечка85 @  1.8.2006,  17:22 Найти цитируемый пост)

Код

..............
var
MyHookHandle : HHook = 0;
Count : integer = 0;
..............


Эти две переменные должны находиться в секции, с атрибутом shared. Это так?
Цитата(Олечка85 @  1.8.2006,  17:22 Найти цитируемый пост)

Код

..............
begin
  SetHook;
end.


Тоесть hook устанавливаеться сразу после загрузки dll. А потом ещё раз?
Цитата(Олечка85 @  1.8.2006,  17:22 Найти цитируемый пост)

Код

..............
procedure SetHook; stdCall; external 'library_podcasts.Dll';
procedure UnHook; stdCall; external 'library_podcasts.Dll';
..............
begin
  SetHook;
  
  FillChar( Si, SizeOf( Si ) , 0 );
..............



Цитата(Олечка85 @  1.8.2006,  17:36 Найти цитируемый пост)
вот так? А в *.dll можно такое писать? На меня дельфи ругается... Может, какие-нибудь библиотеки ещё нужно подключить?

Цитата(Snowy @  1.8.2006,  18:13 Найти цитируемый пост)
Если нужно отправить только число, то можно и без WM_COPYDATA

Лучше использовать PostMessage.

PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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