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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.05.2008, 15:44   #11
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

Засунул роботу с этим делом в таймер - работает!
Можете набросать маленький примерчик как обрабатывать флаг, а то я не особо понимаю как это реализовать!
zhefran вне форума
Старый 06.05.2008, 16:02   #12
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Заведите какую-нибудь boolean-переменную в классе формы и выставляйте её в true в хуке, а в самой форме по таймеру проверяйте, делайте что нужно и возвращайте в false. А ещё лучше обойтись без таймера, а вместо него добавить обработчик своего собственного сообщения и отправлять его из хука через PostMessage (PostMessage !!) самой же форме. А ещё лучше объединить сообщение и переменную, тогда Вы сможете избежать, в первом приближении, возможности обмана Вашей программы... Сегодня уже, честно говоря, сил нету на пример . Если не справитесь, завтра набросаю...
B_N вне форума
Старый 06.05.2008, 16:05   #13
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

Буду очень благодарен!!!
zhefran вне форума
Старый 08.05.2008, 08:35   #14
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

В общем, вот пример с двумя вариантами, смотрите, какой больше нравится и лучше работает.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


const
    WH_MOUSE_LL         = 14;
    WM_LBTNDOWN_INT     = WM_USER + 1;
    WM_MOUSEACTION      = WM_USER + 2;

    strInstallHook      = 'Install Hook';
    strRemoveHook       = 'Remove Hook';

    IDX_L_BUTTON        = 0;
    IDX_M_BUTTON        = 1;
    IDX_R_BUTTON        = 2;

type
{$IFNDEF HANDLE}
  HANDLE  = cardinal;
{$ENDIF}

  TMouseState = record
    pt      : TPoint;
    Buttons : array [0 .. 2] of char;
  end;

  TBeepThreadParams = record
    hStopSignal : HANDLE;
    hBeepSignal : HANDLE;
  end;
  PTBeepThreadParams = ^TBeepThreadParams;

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OnMouseAction (var msg : TMsg); message WM_MOUSEACTION;
    procedure OnLeftButton (var msg : TMsg); message WM_LBTNDOWN_INT;
  private
    hMouseLLHook        : HHOOK;
    hBeepThread         : HANDLE;
    ThreadParams        : TBeepThreadParams;
    { Private declarations }
  public
    MouseState      : TMouseState;
    bValidMessage   : boolean;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
{$O-}

function BeepThreadProc (pThreadParams : PTBeepThreadParams) : DWORD; stdcall;
const
    IDX_STOP    = 0;
    IDX_BEEP    = 1;
var
    hSignals    : array [0 .. 1] of HANDLE;
    WaitResult  : cardinal;
begin
    if pThreadParams = NIL then begin
        result := DWORD(-2);
        exit;
    end
    else begin
        try
            hSignals[IDX_STOP] := pThreadParams.hStopSignal;
            hSignals[IDX_BEEP] := pThreadParams.hBeepSignal;
        except
            result := DWORD(-2);
            exit;
        end;
    end;

    if ( (hSignals[IDX_STOP] = 0) OR (hSignals[IDX_BEEP] = 0) ) then begin
        result := DWORD(-1);
        exit;
    end;

    repeat
        WaitResult := WaitForMultipleObjects(2, @hSignals, FALSE, INFINITE);
        if WaitResult = (WAIT_OBJECT_0 + IDX_STOP) then begin
            break;
        end
        else if WaitResult = (WAIT_OBJECT_0 + IDX_BEEP) then begin
            windows.Beep(4000, 50);
        end;
    until false;

    result := 0;
end;
B_N вне форума
Старый 08.05.2008, 08:37   #15
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

продолжение...
Код:
function MouseLLHookProc (
                    nCode   : integer;
                    wParam  : WPARAM;
                    lParam  : LPARAM) : LRESULT ; stdcall;
type
    MSLLHOOKSTRUCT  = record
        pt          : TPoint;
        mouseData   : DWORD;
        flags       : DWORD;
        time        : DWORD;
        dwExtraInfo : DWORD;
    end;
    PMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT;
begin
    if (HC_ACTION = nCode) then begin
        if (WM_LBUTTONDOWN = wParam) then begin
            Form1.bValidMessage := true;
            PostMessage(Form1.Handle, WM_LBTNDOWN_INT, 0, 0);
        end
        else if (WM_MBUTTONDOWN = wParam) then begin
            SetEvent(Form1.ThreadParams.hBeepSignal);
        end;
        Form1.MouseState.pt := (PMSLLHOOKSTRUCT (lParam)).pt;
        case wParam of
            WM_LBUTTONDOWN  :
                    Form1.MouseState.Buttons [IDX_L_BUTTON] := 'L';
            WM_LBUTTONUP    :
                    Form1.MouseState.Buttons [IDX_L_BUTTON] := '_';
            WM_MBUTTONDOWN  :
                    Form1.MouseState.Buttons [IDX_M_BUTTON] := 'M';
            WM_MBUTTONUP    :
                    Form1.MouseState.Buttons [IDX_M_BUTTON] := '_';
            WM_RBUTTONDOWN  :
                    Form1.MouseState.Buttons [IDX_R_BUTTON] := 'R';
            WM_RBUTTONUP    :
                    Form1.MouseState.Buttons [IDX_R_BUTTON] := '_';
        end;
        PostMessage(Form1.Handle, WM_MOUSEACTION, 0, 0);
    end;
    result := CallNextHookEx(Form1.hMouseLLHook, nCode, wParam, lParam);
end;

procedure TForm1.OnMouseAction(var msg : TMsg);
begin
    self.Label1.Caption :=
        format('X:%4.4d, Y:%4.4d, %s%s%s',
            [
                self.MouseState.pt.X,
                self.MouseState.pt.Y,
                self.MouseState.Buttons [ IDX_L_BUTTON],
                self.MouseState.Buttons [ IDX_M_BUTTON],
                self.MouseState.Buttons [ IDX_R_BUTTON]
            ]);
end;

procedure TForm1.OnLeftButton (var msg : TMsg);
begin
    if self.bValidMessage then windows.Beep(2000, 50);
    self.bValidMessage := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    if self.hMouseLLHook = 0 then begin
        self.hMouseLLHook := SetWindowsHookEx(
                                    WH_MOUSE_LL,
                                    MouseLLHookProc,
                                    GetModuleHandle(NIL),
                                    0);
    end
    else begin
        UnhookWindowsHookEx(self.hMouseLLHook);
        self.Label1.Caption     := '';
        self.hMouseLLHook       := 0;
    end;

    if BOOLEAN(self.hMouseLLHook)
    then self.Button1.Caption := strRemoveHook
    else self.Button1.Caption := strInstallHook;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
    thid    : cardinal;
begin
    self.Button1.Caption        := strInstallHook;
    self.Label1.Caption         := '';
    self.hMouseLLHook           := 0;

    self.MouseState.Buttons [0] := '_';
    self.MouseState.Buttons [1] := '_';
    self.MouseState.Buttons [2] := '_';

    self.ThreadParams.hStopSignal := CreateEvent(NIL, FALSE, FALSE, NIL);
    self.ThreadParams.hBeepSignal := CreateEvent(NIL, FALSE, FALSE, NIL);

    self.hBeepThread := CreateThread(NIL, 0, @BeepThreadProc, @self.ThreadParams, 0, thid);

    SetWindowPos(
            self.Handle,
            HWND_TOPMOST,
            0,
            0,
            0,
            0,
            SWP_NOSIZE OR SWP_NOMOVE OR SWP_NOACTIVATE);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    UnhookWindowsHookEx(self.hMouseLLHook);

    SetEvent(self.ThreadParams.hStopSignal);
    if WAIT_OBJECT_0 <> WaitForSingleObject(self.hBeepThread, 5000) then begin
        TerminateThread(self.hBeepThread, CARDINAL(-4));
    end;

    CloseHandle(self.ThreadParams.hStopSignal);
    CloseHandle(self.ThreadParams.hBeepSignal);
    CloseHandle(self.hBeepThread);
end;

end.
Вложения
Тип файла: rar hook.rar (10.4 Кб, 10 просмотров)
B_N вне форума
Старый 08.05.2008, 10:46   #16
zhefran
Пользователь
 
Аватар для zhefran
 
Регистрация: 08.04.2008
Сообщений: 37
По умолчанию

Огромнейшее человеческое СПАСИБО!!!
zhefran вне форума
Старый 28.05.2008, 19:30   #17
LAFUDR
 
Регистрация: 12.10.2007
Сообщений: 9
По умолчанию

Закоментите плиз function BeepThreadProc и function MouseLLHookProc построчно, если не сложно. Начинающему [***] тяжко с кодом профа.

//Пишите посты так, чтобы их не нужно было править, без подъездно-лавочного жаргона.

Последний раз редактировалось B_N; 28.05.2008 в 20:59.
LAFUDR вне форума
Старый 28.05.2008, 21:02   #18
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

LAFUDR, Вы издеваетесь? Что там комментировать? Стандартный синтаксис паскаля или три вызова трёх функций, по которым есть F1? Смотрите в хэлпе, если после этого останутся конкретные вопросы, задавайте их - получите конкретные ответы. один вопрос - одна тема.
B_N вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скроллинг kl45gp JavaScript, Ajax 0 24.03.2008 23:29
Ms Word Farel Общие вопросы Delphi 0 12.01.2008 16:48
TChart, скроллинг zIG Компоненты Delphi 4 20.07.2007 11:55
Word Pad grafdi Помощь студентам 1 03.05.2007 02:39