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

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
Mouse.Capture := Form1.handle;
при этом все движение мыши будет передаваться указанной форме, даже если мышка бегает не по форме...
ну а дальше думаю уже все понятно _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Честно говоря не совсем понятно (я писал довольно простые программы ...вот...).
Я попробовал на форме по клику отслеживать координаты, но пока не получилось...
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
Откуда: Яблочный рай
|
|
|
Цитата |
|
малость перемудрил
тебе нужно написать обработчик onMouseMove, в котором и выводить координаты мыши, при этом учти что они могут быть отрицательными _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
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
Откуда: Яблочный рай
|
|
|
Цитата |
|
мда, тяжело в деревне без нагана
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; _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Еще вопрос... А когда за пределами формы мышка выходит, или когда я форму сворачиваю будут координаты определяться? (чтобы я в другой запущенной программе по звуку(из моей) слышал что мышь за пределы велезла) |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Я сделал прозрачную форму и проверил - координаты меняются только когда я мышкой по панели формы провожу, т.е. где прозрачно - там не меняется.... |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
мда, обманула книженция  _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
 |
|
|
|
Цитата |
|
Нашел что с помощью хука WH_MOUSE можно сделать...
Но как пока непонял...
Подскажите пожалуйста про этот WH_MOUSE с чем его едят...
Спасибо |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Это у меня не вошлось в форум.... |
|
| В начало |
|
 |
 Belt
Постоянный участник

Возраст: 29
Знак зодиака: 
Зарегистрирован: 13.08.2004
Сообщения: 122
Откуда: Russia
|
|
|
Цитата |
|
Попробуй так:
| Код: |
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
Откуда: Киев
|
|
|
Цитата |
|
Ну это вы уж слишком -- хуки для такой простенькой задачки.
По-моему можно сделать проще. По таймеру брать координаты курсора и проверять, попадают ли они в искомую область. Можно не по таймеру, а по Application.OnIdle.
Координаты мыши: Mouse.CursorPos
Преобразование: TForm.ScreenToClient _________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Шурик писал(а): | Ну это вы уж слишком -- хуки для такой простенькой задачки.
По-моему можно сделать проще. По таймеру брать координаты курсора и проверять, попадают ли они в искомую область. Можно не по таймеру, а по Application.OnIdle.
Координаты мыши: Mouse.CursorPos
Преобразование: TForm.ScreenToClient |
А мне нужно, чтобы дельфи форма была не активна, а активна другая. Будет работать? |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Спасибо всем за помощь
Это получилось
----
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';
не работает.... |
|
| В начало |
|
 |
|