Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Реакция на мышь в не формы   Найти похожие ветки 

 
Roman_man   (2012-10-02 17:27) [0]

Программа дает команду "Выход" при нажатии на любую клавишу или
после сдвига мыши.
Но сдвиг мыши обрабатывается только, если курсор на форме.
Вне его нет реакции.
Как исправить?


var
 P: TPoint;

procedure TForm1.FormCreate(Sender: TObject);
begin
 GetCursorPos(P);
 ScreenToCLient(P);
end;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
 case Msg.message of
   WM_KEYDOWN,     WM_KEYUP,
   WM_SYSKEYDOWN,  WM_SYSKEYUP,
   WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN: Close;
   WM_MOUSEMOVE                                  : If not PointsEqual(msg.pt, P) then Close;
 end;
end;


 
Dimka Maslov ©   (2012-10-02 20:26) [1]

CaptureMouse


 
Roman_man   (2012-10-03 00:51) [2]

Не выходит - не выходит. Игра слов.


procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
 SetCapture(Handle);
 case Msg.message of
   WM_KEYDOWN,     WM_KEYUP,
   WM_SYSKEYDOWN,  WM_SYSKEYUP,
   WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN: Close;
   WM_MOUSEMOVE                                  : If not PointsEqual(msg.pt, P) then Close;
 end;
 ReleaseCapture;
end;


 
Dimka Maslov ©   (2012-10-03 07:49) [3]

Тогда ставим хук на мышь и смотрим каждый раз, где она ошивается.


 
sniknik ©   (2012-10-03 08:06) [4]

> procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
> begin
>  SetCapture(Handle);
что то мне подсказывает, что захватывать мышь/события внутри события формы поздновато будет.

все одно что зайдя в автобус начинать ждать такси, а выходя тут же переставать ждать до следующей поездки в автобусе... сколько шансов что поедете на такси?

p.s. это даже не программирование, не делал т.к. незачем ничего подобного, но чисто по логике...


 
Roman_man   (2012-10-03 10:00) [5]


> Dimka Maslov ©   (03.10.12 07:49) [3]
>
> Тогда ставим хук на мышь и смотрим каждый раз, где она ошивается.
>


А без хука никак? :\


> sniknik ©   (03.10.12 08:06) [4]


Даже если переместить в OnCreate SetCapture(Handle) - не выходит.


 
AV ©   (2012-10-03 10:29) [6]

Как вариант - запускаем поток,  в к-рым постоянно опрашиваем мышь, запоминаем координаты и если следующее положение отличается, считаем, что было перемещение.


 
AV ©   (2012-10-03 11:18) [7]

аля так

 TForm1 = class(TForm)
   btn1: TButton;
   procedure btn1Click(Sender: TObject);
 private
 public      { Public declarations }
   procedure OnObserver(var M: Tmessage); message WM_USER + $01;
 end;

 TMouseObserver = class(TThread)
 private     { Private declarations }
   X, Y: Integer;
   pt : TPoint;
 protected
   procedure Execute; override;
 end;

var
 Form1: TForm1;
 MouseObserver: TMouseObserver;

implementation

{$R *.dfm}
procedure TMouseObserver.Execute;
begin
 GetCursorPos(pt);
 X := pt.X; Y := pt.Y;
 repeat
   GetCursorPos(pt);
   if (Abs(pt.X - X) > 1) or (Abs(pt.Y - Y) > 1) then
   begin
     PostMessage(Form1.Handle, WM_USER + $01, 0, 0);
     Terminate;
   end;
 until Terminated;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
 MouseObserver := TMouseObserver.Create(True);
 MouseObserver.FreeOnTerminate := True;
 MouseObserver.Resume;
end;

procedure TForm1.OnObserver(var M: Tmessage);
begin
 Close;
end;

или на таймер повесить, если не охота потоки юзать
 GetCursorPos(pt);
 X := pt.X; Y := pt.Y;
 repeat
   GetCursorPos(pt);
   if (Abs(pt.X - X) > 1) or (Abs(pt.Y - Y) > 1) then
   begin


 
sniknik ©   (2012-10-03 12:37) [8]

> Даже если переместить в OnCreate SetCapture(Handle) - не выходит.
... но работает
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Close;
end;


 
sniknik ©   (2012-10-03 12:45) [9]

возможно разница связана с тем как получаются события, + особенность VCL со спрятанной формой априкейшина, и пере направлением событий в главную форму... где то что то может "потеряться", в смысле забыли и переслали...


 
Игорь Шевченко ©   (2012-10-03 13:01) [10]


> Программа дает команду "Выход" при нажатии на любую клавишу
> или
> после сдвига мыши.
> Но сдвиг мыши обрабатывается только, если курсор на форме.
>
> Вне его нет реакции.
> Как исправить?


Если мышь двигается вне программы, то команды на выход быть не должно. Или окно надо разворачивать на весь рабочий стол.

Все остальные советы не годятся в той или иной степени.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646262(v=vs.85).aspx
"I would recommend the use of SetCapture for full-screen DirectX applications to prevent "click throughs" to things like taskbar notifications, but for Windowed apps it should not be the standard operating mode."


 
xayam ©   (2012-10-03 13:04) [11]

Удалено модератором


 
Roman_man   (2012-10-03 15:34) [12]


> Игорь Шевченко ©   (03.10.12 13:01) [10]
>
>
> > Программа дает команду "Выход" при нажатии на любую клавишу
> > или
> > после сдвига мыши.
> > Но сдвиг мыши обрабатывается только, если курсор на форме.
>
> >
> > Вне его нет реакции.
> > Как исправить?
>
>
> Если мышь двигается вне программы, то команды на выход быть
> не должно.


Команда на выход - только ради примера. Не более.


 
Игорь Шевченко ©   (2012-10-03 19:54) [13]


> Команда на выход - только ради примера. Не более.


 
Игорь Шевченко ©   (2012-10-03 19:55) [14]

http://www.gunsmoker.ru/2008/10/x-y-z.html


 
sniknik ©   (2012-10-03 20:30) [15]

> http://www.gunsmoker.ru/2008/10/x-y-z.html
из комментариев... возможный ответ
http://bash.im/quote/410956


 
Roman_man   (2012-10-05 13:14) [16]

> x-y-z.html

Чет я сразу не сказал, нужно сделать аналог функции:
GetLastInputInfo



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.224 c
2-1340011274
начинающий_
2012-06-18 13:21
2013.03.22
битовые операции


2-1340219005
Dron83
2012-06-20 23:03
2013.03.22
IdUDPClient1.SendBuffer(t.memory^,t.size);


15-1342885937
alexdn
2012-07-21 19:52
2013.03.22
Курсор для сайта


3-1278415497
kate158
2010-07-06 15:24
2013.03.22
обработка ошибки sql


4-1259833099
Mixali4
2009-12-03 12:38
2013.03.22
Как получить идентификатор контекстного меню