Форум: "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