Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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
........


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

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

Спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.005 c
1-94462
ruslan_as
2002-04-16 09:23
2002.04.29
Прервать процедуру.


1-94408
Коля
2002-04-18 05:49
2002.04.29
FontName To String?


3-94305
Uncle SAM
2002-04-09 00:40
2002.04.29
A не работет такая схема......


4-94646
Romul
2002-02-21 15:34
2002.04.29
Проблема с handle s у дочерних элементов


1-94378
Sound
2002-04-17 01:38
2002.04.29
Как востановить размер окна при запуске программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский