Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.29;
Скачать: CL | DM;

Вниз

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
........


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

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

Спасибо.



Страницы: 1 вся ветка

Текущий архив: 2002.04.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-94501
Miwa
2002-04-16 09:54
2002.04.29
Опять ТП7.


1-94357
NS
2002-04-17 11:57
2002.04.29
Нужно в RUN-Time создавать экземпляры некоторых объектов (для при


14-94574
False
2002-03-20 12:28
2002.04.29
Какое расширение имееи Oracle?


4-94610
MARcoDEN
2002-02-19 20:20
2002.04.29
Аналог функции ExtractFileName


1-94400
Nikolay
2002-04-17 19:50
2002.04.29
Переменная