Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Перехват нажатия кнопки в другой программе


Автор: Des666 6.1.2007, 22:51
Есть программа 1.exe 
как из другой программы можно узнать нажал ли пользователь в ней кнопку "ОК" ?

Автор: anwe 6.1.2007, 22:56
Ставь хук.

Автор: Des666 6.1.2007, 23:27
Я знаю как на окно поставить а как на кнопку? 

Код

procedure TForm1.Timer1Timer(Sender: TObject);
var
  wnd: hwnd;
begin
wnd:= FindWindow(nil, 'Окно');
  if wnd > 0 then
  begin
    timer1.Enabled:=false;
    ShowMessage('wnd exist');
  end
  else
    timer1.Enabled:=true;
end;
end.

Автор: anwe 6.1.2007, 23:59
Хук ставится не на окно или кнопку, а на сообщения, что это окно генерирует или обрабатывает.
Если программа, что надо перехватывать, одна, знаешь ее класс и имя, можно еще использовать субклассинг - переопределение адреса оконной процедуры.

Автор: Des666 7.1.2007, 00:15
можно пример? Я вообще непонимаю как это можно сделать...

Автор: pomogite 9.1.2007, 14:45
Мне тоже немешало бы узнать как это можно сделать...

Автор: Voyager 9.1.2007, 18:45
Одна моя прога, которая загружает другую прогу, добавляет в нее кнопки, отлавливает нажатия и выполняет определенные действия. А также отслеживает нажатия клавиш, вращение колеса мыши и т.д. в другой проге.
Пожалуйста, разбирайтесь.

Автор: Des666 9.1.2007, 19:38
Вот написал так
Код
unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

type

  TForm1 = class(TForm)

    Button1: TButton;

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  Hook: hHook;

implementation

{$R *.dfm}

function HookProc(Code: Integer; WParam: Word; LParam: LongInt): LongInt; stdcall;

var

Msg: PEventMsg;

LogChar: Char;

begin

if Code >= 0 then begin

   Result := 0;

   Msg := Pointer(LParam);

   LogChar := Chr(Msg.paramL);

   if Msg.message = WM_MBUTTONDOWN then

   showmessage('OK')

end else

    Result := CallNextHookEx(Hook, Code, WParam, LParam);

    end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Hook := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);

exit;

end;

end.


Но как сделать так чтобы программа реагировала только на нажатие кнопки "Ок" и только в нужной мне программе... да и этот код ведёт себя как-то странно... может кто подправит?

Автор: tigger 10.1.2007, 17:01
Нужно создать глобальную ловушку, т.е в dll а затем:
На отлов клика по ней левой кнопки мышки
1. Определить что нажата левая кнопка мышки
1. Определить handle кнопки
2. Определить ее заголовок
3. Определить handle родителя кнопки
4. Определить заголовок родителя

если все условия сошлись то это твое нажатие
ну вот в прочем и все..... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)