Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2008, 21:30   #1
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию Глобальные хуки

Код:
library lib;

uses Windows;

Var
H : THandle;

function HookDC(Code, wParam, lParam : integer): LResult stdcall;
begin
if Code >= 0 then
  begin
  if wParam = WM_MBUTTONDBLCLK then
  end
    else
    result := CallNextHookEx(H, code, wParam, lParam);
end;

procedure sethook;
begin
H:= SetWindowsHookEx(WH_MOUSE, @hookDC, hInstance, 0);
end;

procedure removehook;
begin
  UnhookWindowsHookEx(H);
end;

exports
sethook name 'sethook',
removehook name 'removehook';
end.

begin
end.
Вопрос будет-ли это работать, запускать не решаюсь 8)
Как сделать чтобы при двойном клике Timer1.Enabled := true; я вродебы по поиску полазил но ненашол похожего, моглибы вы объяснить пошагово как что сделать.
Zeraim вне форума Ответить с цитированием
Старый 24.05.2008, 15:53   #2
hoza_syl
Форумчанин
 
Аватар для hoza_syl
 
Регистрация: 23.05.2008
Сообщений: 219
По умолчанию

Процедура HookDc не правильная.

Нужно написать так:

Код:
function HookDC(Code, wParam, lParam : integer): LResult stdcall;  
begin  
CallNextHookEx(H, code, wParam, lParam); //передаем сообщение следующей ловушке
if Code = HC_ACTION then  
  begin  
  if TMsg(Pointer(lParam)^).message = WM_MBUTTONDBLCLK then  
  timer1.Enabhled:=false; 
  end;
    result := 0  
end;
Примичание: если таймер находится не в DLL а в другой проге, то
Timer1.enabhled:=false тут не сойдет. Нужно послать главной форме какое то свое сообщение. А в форме назначить этому сообщению некий обработчик, который будет выключать таймер.

Это можно сделать так:

Добавляеш в DLL:

Код:
сonst WM_MYMESSAGE = WM_USER + 334 //любое число
А вместо
Код:
Timer1.enabhled:=false
; пишеш :
Код:
SendMessage(FindWindow(nil,'заголовок окна'),WM_MYMESSAGE,0,0);
В приложении в котором находится таймер пишеш:
Код:
...
const WM_MYMESSAGE = WM_USER+344;
...
Form1= class (Tform)
...
procedure TimerStop (Var msg :Tmessage); message WM_MYMESSAGE;
...
implementation
...
procedure TimerStop (Var msg :Tmessage); message WM_MYMESSAGE;
begin
timer1.enabhled:=false
end;
...
Если есть вопросы обращайся.
The Revolution is Now!
hoza_syl вне форума Ответить с цитированием
Старый 24.05.2008, 16:00   #3
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Спасибо огромнейшее, шас буду разбиратся 8)
Zeraim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц