Форум: "Прочее";
Текущий архив: 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.078 c