Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Вниз

Hook 


Grim Rider   (2002-02-20 13:20) [0]

Господа, ткните меня носов в ошибку.

При запуске следующий код убивает систему, благо на 2000 сижу, повторно логиниться можно.


...
function ShellProc(nCode: Integer; WPARAM: Integer; LPARAM: Integer): Integer; Stdcall;
....

var
Form1: TForm1;
hHk: HHook;

implementation
uses Clipbrd, SendKeys;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
hHk := SetWindowsHookEx(WH_CALLWNDPROC, @ShellProc, HInstance, 0);
end;

function ShellProc(nCode: Integer; WPARAM: Integer; LPARAM: Integer): Integer; Stdcall;
begin
Result := CallNextHookEx(hHk, nCode, WPARAM, LPARAM);
// will do smth here
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(hHk);
end;



Мне нужен системный хук, который следит за другим приложением и клипбордом.
Помогите плз.



Digitman   (2002-02-20 13:49) [1]

HHOOK SetWindowsHookEx(

int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle of application instance
DWORD dwThreadId // identity of thread to install hook for
);

...
lpfn

Points to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.



Fellomena   (2002-02-20 15:22) [2]

По-русски:
что бы глобальный hook мог работать необходимо, что бы его реализация находилась в DLL.
Это связанно с тем, что когда в каком-либо приложении происходит событие, на которое ты поставил hook, это приложение
проецирует эту DLL на своё адресное пространство (а как ещё callback ф-ия будет работать ?).
Именно поэтому надо использовать DLL.
Сделай всё тоже самое, только в DLL и всё будет ok 8)



Grim Rider   (2002-02-20 15:30) [3]

Мартышка к старости слаба глазами стала...
Это про меня. =8))

Спасибо



Digitman   (2002-02-20 16:47) [4]

>Fellomena
>>"необходимо, что бы его реализация находилась в DLL"

а вот то, что ты утверждаешь, из приведенного фрагмента хэлпа, вовсе как бы и не следует



Grim Rider   (2002-02-21 03:27) [5]

2Digitman ©:
за помощь спасибо, но Fellomena объяснил(а) немного более доступно.



Digitman   (2002-02-21 08:21) [6]

>Grim Rider
И теперь ты срочно забросишь эксперименты с EXE и начнешь писать DLL ? Так и не вникнув в описание параметров ?



Fellomena   (2002-02-21 10:28) [7]

2 Digitman: а я и не утверждала, что это следует из приведённого фрагмента 8)
Я наскоро попыталась объяснить, почему некоторые типы ловушек могут быть использованы только с привлечением механизма DLL =)
И объясни мне пожалуйсто, зачем проводить какие-то эксперименты с EXE, если определённые вещи невозможны при таком подходе по определению ?
Я настаиваю, что глобальную ловушку (именно глобальную, а не ту, что ставится на конкретный поток) можно реализовать только в DLL (по крайней мере если не "трюкачить").




Digitman   (2002-02-21 10:43) [8]

>Fellomena
Да, согласен c тобой безоговорочно.
Фразу автора "Мне нужен системный хук.." я упустил из вида.



Grim Rider   (2002-02-21 11:03) [9]

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

Тут возник попутный вопрос (не один, а много конечно же =8)))

Я пытаюсь переписать прогу с ВБ, которую я и один мой коллега писали несколько лет назад. Та прога мониторила клаву на определенные последовательности, и если таковые были, при их копировании в буфер, переделовала содержимое буфера и через SendKeys посылала обратно в прогу, которая инициировала копирование в буфер.
Так вот, там я обошелся SetWindowLong.

В новой проге, я не хочу использовать SendKeys, так как они очень нестабильны. Я хочу использовать PostMessage(WM_PASTE...).
Если используется SetWindowLong, то при попытке послать сообщение "впастить" другому приложению получаю -1, Access Denied...

Вопрос в том, что все таки стоит использовать SetWindowLong или SetWindowsHookEx?

Я перенес хук по вашему совету в длл - спасибо - все переваривается без проблем. Я регистрирую себя с очереди на буфер обмена через SetClipboardViewer, далее пытаюсь ловить сообщения:


function GlobalHook(nCode: Integer; wParam: Integer; lParam: Integer): Integer; stdcall;
var
...
begin
if nCode = HC_ACTION then begin
case wParam of
WM_DRAWCLIPBOARD: begin
........


Правильно ли это? Потому как, ничего не происходит, и я подозреваю, что сюда я просто не попадаю.

Прошу не пинать, и извинить, если вопросы дурацкие, и объяснить или отправить туда где доступно написано (Мсдн я читаю постоянно, но не совсем все понятно).

Спасибо.




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.29;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.031 c
3-94283           weak                  2002-04-08 14:54  2002.04.29  
MS SQL Database1.Params


1-94499           ymin                  2002-04-15 14:41  2002.04.29  
фон для формы какой-нибудь рисунок


1-94391           LazyCat               2002-04-17 17:38  2002.04.29  
Подскажите, что я не так делаю...


7-94588           Torn                  2002-01-31 09:12  2002.04.29  
Вход в сеть под Win98 автоматически без ввода пароля


1-94422           dimonf                2002-04-17 19:50  2002.04.29  
Подскажите, как правильно позиционировать TPanel и StringGrid?