Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-60114
agentru
2003-06-05 22:30
2003.06.19
Создание программы случайных чисел!


6-60292
temp
2003-04-11 12:45
2003.06.19
Как настроить чтобы при обращении к CGI появлялось окно с паролем


14-60424
revo
2003-06-03 15:51
2003.06.19
Где скачать AsyncPro?


14-60372
Eagle Owl
2003-06-02 21:23
2003.06.19
Установка компонент


3-60083
Alexey
2003-05-27 16:59
2003.06.19
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский