Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Блин нету имени у этих объектов
А можно с хуком по подробней...

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 08:09 28-03-2006 | Исправлено: mutmut, 08:12 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WH_GETMESSAGE - глобальная ловушка, которая находится в dll и перехватывает все сообщения в системе. Самый простой вариант - пишешь программу, на ней 2 кнопки

Код:
procedure Hook(Flag: Boolean);  stdcall; external "Hook.dll"
............
Procedure Button1Click  //Установить ловушку
begin
Hook(True);
end;
 
Procedure Button2Click  //Удалить ловушку
begin
Hook(False);
end;
............

Потом саму ловушку Hook.dll

Код:
var
 CurrentHook: HHook;
    wnd: hwnd;
 
function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
if code<0 then begin
GlobalKeyBoardHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
{Здесь ставим фильтр на сообщения, например на клик мышью:
Wnd:=Tmsg(Pointer(Lparam)^).hwnd;
if Tmsg(Pointer(Lparam)^).message=wm_lbuttondown then begin}
...... //Здесь запоминаем параметры сообщения - Wnd, Wparam, Lparam
 end;
CallNextHookEx(CurrentHook,code,wParam,lparam);
GlobalKeyBoardHook:=0;
Exit;
end;
 
procedure Hook(Flag:Boolean); stdcall;
Begin
 IF Flag then
SysHook:=SetWindowsHookEx(WH_GetMessage,@SysMsgProc,HInstance,0)
  Else
  Begin
   UnhookWindowsHookEx(SysHook);
   SysHook:=0;
  End;
End;
 
exports Hook;
 
begin
end.

Запускаешь ловушку, кликаешь мышью, перехватываешь сообщение. Ну и потом попробуй воспроизвести его из программы (sendmessage)
 
 
 
Добавлено:
Может есть неточности, Делфи под рукой нету

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 08:44 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
SysHook:=SetWindowsHookEx(WH_GetMessage,@SysMsgProc,HInstance,0)  
  Else  
  Begin  
   UnhookWindowsHookEx(SysHook);  
   SysHook:=0;  

А какой тип у переменной и на что указатель?

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 09:17 28-03-2006 | Исправлено: mutmut, 09:19 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А какой тип у переменной и на что указатель?

Здесь указывается процедура перехвата, т.е. в нашем случае - @GlobalKeyBoardHook
 
 
Добавлено:
Немного неудачное название процедуры, это для перехвата сообщений клавиатуры... Но названия в принципе роли не играют, это все компромис!

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 09:25 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
А переменную SysHook как определить? Насколько я понял тип у неё HHook. Ругается что не определено host application.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 09:38 28-03-2006 | Исправлено: mutmut, 09:41 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
var  
CurrentHook: HHook;  
 
Переименуй это Syshook. Черт, намудрил с именами, сорри. Если что, спрашивай еще

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 09:48 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Всё равно при компиляции пищет что не определено host application идите в run|parametrs и укажите, а что там указывать?

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 09:55 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ты скорей всего пишешь не dll а обычное приложение. Файл -> Создать -> Другое -> Мастер DLL (Если память не изменяет). У dll начало кода - это не PROGRAM а LIBRARY. После компиляции в папке с соурсами должен появиться файл с расширением dll. Кидаешь его в папку с программой (та, что с двумя кнопками) и запускаешь ее (пргграмму). Пробуй!

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 10:04 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Пишу именно длл. Где то не тут копать надо. У меня ругался на {$R *.res}, я заремарил стал говорить, то что выше писал.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 10:08 28-03-2006 | Исправлено: mutmut, 10:11 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хммм... Можешь выложить весь текст длл?

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 10:12 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar

Цитата:
library Hooks;
uses
  Windows, Messages, SysUtils, Variants, Classes,
  Dialogs, StdCtrls, ExtCtrls,ShellApi;
 
//{$R *.res}
 
var
 SysHook: HHook;
    wnd: hwnd;
function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
if code<0 then begin
GlobalKeyBoardHook:=CallNextHookEx(SysHook,code,wParam,lparam);
Exit;
end;
Wnd:=Tmsg(Pointer(Lparam)^).hwnd;
if Tmsg(Pointer(Lparam)^).message=wm_lbuttondown then
  begin
  end;
CallNextHookEx(SysHook,code,wParam,lparam);
GlobalKeyBoardHook:=0;
Exit;  
end;  
 
procedure Hook(Flag:Boolean); stdcall;
Begin  
 IF Flag then  
SysHook:=SetWindowsHookEx(WH_GetMessage,@GlobalKeyBoardHook,HInstance,0)
  Else
  Begin
   UnhookWindowsHookEx(SysHook);
   SysHook:=0;
  End;  
End;  
 
exports Hook;  
 
begin  
end.
 

Вотс.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 10:18 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А! Ну dll'ка появилась в папке? По идее должна, а на это сообщение забить можно.

Код:
uses  
  Windows, Messages, SysUtils;

Этого достаточно . И еще

Код:
if Tmsg(Pointer(Lparam)^).message=wm_lbuttondown then  
  begin  
  end;  
CallNextHookEx(SysHook,code,wParam,lparam);  
code]Между бегином и ендом можешь вставить
[code]windows.beep(300,20);

Чтобы проверить, что ловушка правильно устанавливается

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 10:27 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Нда.. смотрел же не увидел, да всё ок. Теперь другая проблема

Код:
 
procedure Hook(Flag: Boolean);  stdcall; external 'Hook.dll' name 'Hook';
еще
вот так пробовал
procedure Hook(Flag: Boolean);  stdcall; external 'Hook.dll';
 


Цитата:
 
[Error] Unit3.pas(14): Field definition not allowed after methods or properties
 

Вот что пишет. длл лежит в папке с проектом название hook.dll.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 10:48 28-03-2006 | Исправлено: mutmut, 10:50 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
procedure Hook(Flag: Boolean);  stdcall; external 'Hook.dll';

Ставь это сразу после строк

Код:
implementation
 
{$R *.dfm}

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 10:54 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
ООО чудо Знания сила!!  
А подскажи ещё как мне теперь за место бипа получить в мессаджбохе или подобной штуке вот эти значения Wnd, Wparam, Lparam.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 11:20 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно конечно и в мессажбоксе, но будет неудобно, так как он будет вылазить при каждом нажатии левой кнопкой и ты его попросту не закроешь. Лучше замутить что-нить другое. Например, запись в файл... А узнать эти значения так:

Код:
if Tmsg(Pointer(Lparam)^).message=wm_lbuttondown then
  begin
Tmsg(Pointer(Lparam)^).wParam;
Tmsg(Pointer(Lparam)^).lParam;
Tmsg(Pointer(Lparam)^).hwnd;
  end;

Используй inttostr() чтоб преобразовать их в строку. Узнаешь их, пиши прогу, которая будет отсылать сообщение
Код:
sendmessage(hwnd, message, wParam, lParam)

Но не факт что это будет работать, мы ведь только пробуем

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 11:31 28-03-2006
Olezka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
А где именно эта закладка

Всего записей: 624 | Зарегистр. 30-03-2005 | Отправлено: 11:42 28-03-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Olezka

Цитата:
А где именно эта закладка

Это не закладка, а TFileStream - не компонент, а класс.
нужно в uses добавить Classes

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 12:18 28-03-2006
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Olezka
TFileStream это не компонент, а класс, так что создавать его нужно вручную в коде программы.
http://www.yaguo.ru/InfoDelphi/Delphi_for_%20professionals/Glava9/Index10.html

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 12:20 28-03-2006
Olezka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
EZH
Все въехал спасиба

Всего записей: 624 | Зарегистр. 30-03-2005 | Отправлено: 12:37 28-03-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru