Форум: "Основная";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
ВнизКак отловить событие, когда курсор мыши вне формы! Найти похожие ветки
← →
Dr. Andrew (2003-06-04 14:30) [0]Необходимо выполнить некоторые действия, когда курсор мыши находится за границами формы и нажимается кнопка мыши. Существует ли возможность отловить это событие.
Например, если в событии таймера (Timer1.onTimer), с одновременно нажатой (MouseDOWN) левой кнопкой мыши, мы определяем позицию курсора на экране (Win API - GetCursorPos(APoint: TPoint)), то как можно при отжатии (MouseUP), например левой кнопки мыши, остановить таймер (кнопка мыши может находиться вне пределов главной формы, т.е. в какой-то части области Screen)?
Если можно, маленький пример!
← →
Skier (2003-06-04 14:32) [1]Hook ?
← →
kull (2003-06-04 14:34) [2]Может быть MouseCapture?
← →
Dr. Andrew (2003-06-04 15:02) [3]Если можно все же предложите свой пример кода для решения этой проблемы!
← →
kull (2003-06-04 15:17) [4]
> Dr. Andrew © (04.06.03 15:02)
Код писать заново в лом. Готового примера нет.
Но смысел такой:
Делаешь например SetCaptureControl(Form1);
и все события от мыши теперь ловит форма независимо от координат мыши.
Только главное не забыть снять захват мыши обратно.
← →
Dr. Andrew (2003-06-04 15:50) [5]А что означает "Только главное не забыть снять захват мыши обратно."? Как это выглядит в виде кода?
Может быть все-таки кто-нибудь откликнется, хотя бы со схематичным кодом. Теория это прекрасно, но увидеть пример в "живую" все же поучительнее...
← →
Palladin (2003-06-04 16:09) [6]SetCaptureControl передает все события мыши установленому TControl и другим ничего не передается... врядли автор хотел именно этого, так что скорее всего hook...
← →
kull (2003-06-04 16:19) [7]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Caption := Format("%d:%d",[X, Y]);
//здесь вроде захват сам снимается
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetCaptureControl(Self);
end;
end.
← →
kull (2003-06-04 16:20) [8]
> Palladin © (04.06.03 16:09)
Да, может быть, тогда ему виднее.
← →
Dr. Andrew (2003-06-04 16:39) [9]kull. Спасибо за помощь!
Но увы, пример не работает, необходимо как-то остановить таймер в данном конкретном коде, но как?
Может все же найдется вариант решения? Хотя бы из принципа!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
StaticText1: TStaticText;
Bevel1: TBevel;
procedure Timer1Timer(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var APoint: TPoint;
begin
GetCursorPos(APoint);
Label1.Caption:= Format("%d : %d", [APoint.X, APoint.Y]);
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled:= true;
end;
end.
← →
kull (2003-06-04 16:52) [10]Боюсь что в данном случае мой способ не подойдет. Palladin прав.
← →
Dr. Andrew (2003-06-04 17:12) [11]Может кто-то подскажет как практически применить Hook для решения данной проблемы!
← →
Skier (2003-06-04 17:17) [12]>Dr. Andrew © (04.06.03 17:12)
На этом сайте есть статья и пример по реализации Hook-ов
← →
Palladin (2003-06-04 17:20) [13]Меня интересует какая нужда заставила останавливать таймер при таких необычных обстоятельствах?
← →
Dr. Andrew (2003-06-04 17:27) [14]Skier
На каком сайте? Можете выложить ссылку?
Palladin
Если Вы можете предложить решение - опубликуйте его. Уверен оно будет интересно для многих пользователей. Просто есть такая задача! Ее надо решить!
← →
Song (2003-06-04 18:04) [15]WM_NCMOUSEMOVE
← →
Palladin (2003-06-04 18:06) [16]
> Dr. Andrew © (04.06.03 17:27)
тебе же сказали, на этом сайте...
решение уже опубликовано, ищи...
← →
Skier (2003-06-04 18:06) [17]>Dr. Andrew © (04.06.03 17:27)
На этом. Ссылку найдёшь сам, сие не трудно
>Song © (04.06.03 18:04)
Вряд ли спасёт.
← →
sergiu (2003-06-04 18:07) [18]
Чтобы отслеживать события во всей Windows используют ловушку (hook). Для этого нужно создать функцию, обрабатывающую сообщения. Адрес этой функции нужно передать Windows при установке ловушки.
Эта программа определяет, нажата ли левая или правая кнопка мыши, при движении мыши определяет ее координаты. При нажатии на клавишу клавиатуры определяется, что это за клавиша.
var
HookHandle: hHook;
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
key: integer;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of
WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
WM_LBUTTONDOWN: CheckBox1.Checked := true;
WM_LBUTTONUP: CheckBox1.Checked := false;
WM_RBUTTONDOWN: CheckBox2.Checked := true;
WM_RBUTTONUP: CheckBox2.Checked := false;
WM_KEYUP: CheckBox3.Checked := false;
WM_KEYDOWN: begin
CheckBox3.Checked := true;
key := msg.paramL and 255;
if key in [48..57, 65..90]
then Edit1.Text := Edit1.Text + chr(key);
end;
end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.FormStyle := fsStayOnTop;
CheckBox1.Enabled := false;
CheckBox1.Caption := "left button";
CheckBox2.Enabled := false;
CheckBox2.Caption := "right button";
CheckBox3.Enabled := false;
CheckBox3.Caption := "keyboard";
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
Edit1.Text := "";
Edit1.Enabled := false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle > 0 then
UnhookWindowsHookEx(HookHandle);
end;
← →
Song (2003-06-04 18:12) [19]2Skier © (04.06.03 18:06)
Да действительно.
Тогда может получится через SetCapture, чтобы хук не писать.
← →
sergiu (2003-06-04 18:13) [20]Авторство не мое!! :o)
← →
Dr. Andrew (2003-06-04 18:58) [21]Спасибо всем!
Есть ли еще возможные варианты решения?
sergiu
А как можно Ваш код соединить с моим кодом(именно с таймером - включение\отключение на событие левой кнопки мыши) выложенным чуть выше?
← →
Skier (2003-06-04 19:01) [22]>Dr. Andrew © (04.06.03 18:58)
-"Вы что ?! И есть за меня будите ?!"
-"Ага !"
← →
Palladin (2003-06-04 19:06) [23]:))
← →
Dr. Andrew (2003-06-04 19:30) [24]Skier
Просто во всем быть гением не возможно!
Я столкнулся с проблемой и обратился к мастерам за помощью, потому что по данной тематике не имею достаточного опыта.
так что если Вы и подскажите - от этого выиграю не только я один, но и другие пользователи, которые прочитают нашу переписку. А вопрос то ведь интересный?!
← →
Skier (2003-06-04 19:34) [25]>Dr. Andrew © (04.06.03 19:30)
http://www.delphimaster.ru/articles/hooks/index.html
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c