Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Как отслеживать на экране движение мыши?...
На страницу 1, 2  След.

Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
MIg
Гость







СообщениеПн, 29-Ноя-2004 12:43    Заголовок сообщения: Как отслеживать на экране движение мыши?...
Цитата

Я раньше программировал в дельфи только на формах (и то не очень то...).
А сейчас поставили такую задачу.
Запускается софт. На нем есть прямоугольник (наклоненный..В принципе не важно.. Т.е. есть область экрана...) И мне нужно на дельфи написать прогу, чтобы когда мышка находится внутри этого прямоугольника (области экрана), раздавался бы звук. Выхожу за область - прекращается. Или наоборот (чтобы менять можно было хочу звук снаружи, хочу внутри...).
Вот.
Как и какие функции использовать чтобы именно на экране (не на форме у меня мышь отслеживалась?). С чего начать?
Может примеры такие где есть или кто что похожее делал?...


Спасибо заранее за помощь
В начало
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеПн, 29-Ноя-2004 13:05 
Цитата

Mouse.Capture := Form1.handle;
при этом все движение мыши будет передаваться указанной форме, даже если мышка бегает не по форме...
ну а дальше думаю уже все понятно

_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
MIg
Гость







СообщениеПн, 29-Ноя-2004 14:13 
Цитата

Честно говоря не совсем понятно (я писал довольно простые программы ...вот...).
Я попробовал на форме по клику отслеживать координаты, но пока не получилось...

procedure TForm1.FormCreate(Sender: TObject);
begin
Mouse.Capture := Form1.handle;
end;

procedure TForm1.FormClick(Sender: TObject);
var
CursorPos:TPoint;
begin
Mouse.Capture := Form1.handle; GetCursorPos(CursorPos);
Label1.Caption:=IntToStr( CursorPos.x);
end;

Как подступиться к цели?..
В начало
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеПн, 29-Ноя-2004 14:20 
Цитата

малость перемудрил

тебе нужно написать обработчик onMouseMove, в котором и выводить координаты мыши, при этом учти что они могут быть отрицательными

_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
MIg
Гость







СообщениеПн, 29-Ноя-2004 14:39 
Цитата

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
CursorPos:TPoint;
begin
Mouse.Capture := Form1.handle;
GetCursorPos(CursorPos);
Label1.Caption:=IntToStr( CursorPos.x);
end;

Выдает координаты только когда и по форме вожу... А нужно ведь чтобы и вне формы координаты считывались
В начало
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеПн, 29-Ноя-2004 14:56 
Цитата

мда, тяжело в деревне без нагана :)
Mouse.Capture := Form1.handle; выполнять только один раз
обрати внимание на параметры X/Y - это координаты мыши, следовательно обработчик будет таким:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Label1.Caption:=Format('X=%d Y=%d', [x, y]);
end;

_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
MIg
Гость







СообщениеПн, 29-Ноя-2004 15:48 
Цитата

Еще вопрос... Скромный А когда за пределами формы мышка выходит, или когда я форму сворачиваю будут координаты определяться? (чтобы я в другой запущенной программе по звуку(из моей) слышал что мышь за пределы велезла)
В начало
MIg
Гость







СообщениеПн, 29-Ноя-2004 17:01 
Цитата

Я сделал прозрачную форму и проверил - координаты меняются только когда я мышкой по панели формы провожу, т.е. где прозрачно - там не меняется....
В начало
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеВт, 30-Ноя-2004 6:33 
Цитата

мда, обманула книженция :(
_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
СообщениеВт, 30-Ноя-2004 11:35 
Цитата

Нашел что с помощью хука WH_MOUSE можно сделать...
Но как пока непонял...
Подскажите пожалуйста про этот WH_MOUSE с чем его едят...

Спасибо
В начало
MIg
Гость







СообщениеВт, 30-Ноя-2004 11:43 
Цитата

Это у меня не вошлось в форум....
В начало
Пол:Муж Belt
Постоянный участник


Возраст: 29
Знак зодиака: Водолей
Зарегистрирован: 13.08.2004
Сообщения: 122
Откуда: Russia
СообщениеСр, 01-Дек-2004 12:25 
Цитата

Попробуй так:
Код:

theHook:THandle;
...
function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall;
var
  msg : PMouseHookStruct;
  w : THandle;
  style : integer;

Begin
  if nCode<0 then begin
    result := CallNextHookEx(theHook, nCode, wParam, lParam);
    exit;
  end;
  msg := PMouseHookStruct(lParam);
  Form1.Caption:=IntToStr(msg^.pt.X)+':'+IntToStr(msg^.pt.Y);
  result := CallNextHookEx(theHook, nCode, wParam, lParam);
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
  theHook := SetWindowsHookEx(wh_mouse, @mouseHook, hInstance, 0);
  if theHook = 0 then messageBox(0,'Error!','Error!',mb_ok);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=False;
  UnhookWindowsHookEx(theHook);
  CanClose:=True; 
end;
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеПт, 03-Дек-2004 2:25 
Цитата

Ну это вы уж слишком -- хуки для такой простенькой задачки.

По-моему можно сделать проще. По таймеру брать координаты курсора и проверять, попадают ли они в искомую область. Можно не по таймеру, а по Application.OnIdle.

Координаты мыши: Mouse.CursorPos
Преобразование: TForm.ScreenToClient

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
СообщениеПт, 03-Дек-2004 21:32 
Цитата

Шурик писал(а):
Ну это вы уж слишком -- хуки для такой простенькой задачки.

По-моему можно сделать проще. По таймеру брать координаты курсора и проверять, попадают ли они в искомую область. Можно не по таймеру, а по Application.OnIdle.

Координаты мыши: Mouse.CursorPos
Преобразование: TForm.ScreenToClient


А мне нужно, чтобы дельфи форма была не активна, а активна другая. Будет работать?
В начало
MIg
Гость







СообщениеСб, 04-Дек-2004 0:43 
Цитата

Спасибо всем за помощь
Это получилось
----
procedure TForm1.Timer1Timer(Sender: TObject);
var
CursorPos:TPoint;
x,y:integer;
Key: Char;
begin
GetCursorPos(CursorPos);


x:=CursorPos.x;
y:=CursorPos.y;

Form1.Caption:=IntToStr(x)+'+'+IntToStr(y);
if ((x<267)or(x>667)) then MediaPlayer1.Play;
if ((y<212)or(y>356)) then MediaPlayer1.Play;
//Form1.FormKeyPress() ;
//if Key = 'h' then Form1.Caption:='sdfsdfsdf';
end;
---------

Вот...
Теперь не получается по нажатию клавиши остановить звук...
Как использовать нажатие клавиши?
Просто //if Key = 'h' then Form1.Caption:='sdfsdfsdf';
не работает....
В начало
Показать сообщения:   
Страница 1 из 2 На страницу 1, 2  След.
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100