Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.1 c
2-1341996851
MTK
2012-07-11 12:54
2013.03.22
Отправка почты


15-1337460294
Pit
2012-05-20 00:44
2013.03.22
Лига чемпионов, финал!


15-1312895393
Kerk
2011-08-09 17:09
2013.03.22
Шахматный турнир


15-1342015306
Дмитрий С
2012-07-11 18:01
2013.03.22
Apache mod_rewrite


15-1329835501
Pavia
2012-02-21 18:45
2013.03.22
Максимально выделить память





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский