Вверх ↑
Этот топик читают: Гость
Ответов: 17
Рейтинг: 0
#1: 2020-08-16 15:27:16 ЛС | профиль | цитата
Есть код найденный на просторах этого сайта, который отслеживает нажатие/перемещение мышки
Пример

Add(InlineCode,12360657,98,73)
{
@Hint=#24:Глобальный перехват мыши|
EventPoints=#2:ev|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|17: ev:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 ‹› 0 then d := d or $FFFF0000;|0:|30: str := Int2Str(w)+Int2Str(d);|25: _hi_OnEvent(hac.ev,str);|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.|
link(ev,4130651:doText2,[])
}
Add(Edit,4130651,147,66)
{
Width=70
Text=""
}

Так вот замечено, что через разное время он перестаёт работать. Помогите реализовать отслеживание, что этот код перестал работать и как-то его надо бы перезапустить.

Редактировалось 2 раз(а), последний 2020-08-16 15:31:58
карма: 0

0
Ответов: 2059
Рейтинг: 132
#2: 2020-08-20 19:04:46 ЛС | профиль | цитата
rav, у меня вообще не крмпилируется!
C:\HiAsm\Elements\delphi\code\hiInlineCode_244B310.pas(41) Error: Illegal character in input file: '<' ($8B)
А так?:

Add(MainForm,633411,189,63)
{
Position=1
Point(Handle)
link(onCreate,15561254:doPopup,[])
}
Add(InlineCode,12360657,336,301)
{
@Hint=#24:Глобальный перехват мыши|
EventPoints=#2:ev|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|17: ev:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 <> 0 then d := d or $FFFF0000;|0:|30: str := Int2Str(w)+Int2Str(d);|25: _hi_OnEvent(hac.ev,str);|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.|
link(ev,14423304:doAdd,[])
}
Add(Memo,14423304,392,301)
{
Left=10
Top=5
Width=160
Height=260
AddType=1
ScrollBars=2
}
Add(InfoTip,13344029,322,98)
{
Info=#20:5120 - движение мыши|55:522ХХХ - прокрутка колеса, где ХХХ - значение прокрутки|18:5130 - нажатие ЛКМ|21:5140 - отпускание ЛКМ|18:5160 - нажатие ПКМ|21:5170 - отпускание ПКМ|21:5190 - нажатие колеса|24:5200 - отпускание колеса|33:5231 - нажатие 1-й боковой кнопки|36:5241 - отпускание 1-й боковой кнопки|33:5232 - нажатие 2-й боковой кнопки|35:5242 - отпускание 2-й боковй кнопки|
Frame=2
Transparent=1
HAlign=0
Width=316
Height=172
Margin=5
}
Add(WinTools,15561254,238,70)
{
link(Handle,633411:Handle,[(244,58)(220,58)(220,107)(195,107)])
}

карма: 6

0
Ответов: 8926
Рейтинг: 823
#3: 2020-08-20 21:26:46 ЛС | профиль | цитата
flint2, который раз говорю: этот форум меняет символы больше ">" и меньше "<" на текстовые кавычки, поэтому и IC скопированный с форума с такими кавычками и не работает. (Вот и сейчас заменил ).
Этот IC рабочий (Win10, 64), отслеживает нажатия кнопок и скролл, правда выход без разделителей
карма: 19

0
Ответов: 2059
Рейтинг: 132
#4: 2020-08-20 21:47:23 ЛС | профиль | цитата
Леонид, о чём-то подобном догадывался...
этот форум меняет символы больше ">" и меньше "<" на текстовые кавычки

Опять не слава Богу. Разве можно держать в голове такие глупости - не одним сайтом единым...

Редактировалось 1 раз(а), последний 2020-08-20 21:51:16
карма: 6

0
Ответов: 1926
Рейтинг: 172
#5: 2020-09-09 15:56:57 ЛС | профиль | цитата
Понекрпостю, раз сразу не заметил.
Вот поинтереснее решение:
Add(InlineCode,10339731,252,399)
{
@Hint=#24:Глобальный перехват мыши|
EventPoints=#11:onMouseMove|13:onLButtonDown|11:onLButtonUp|13:onRButtonDown|11:onRButtonUp|11:onWheelDown|9:onWheelUp|8:onScroll|14:onX1ButtonDown|11:onX1BttonUp|14:onX2ButtonDown|11:onX2BttonUp|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|38:uses kol,Share,Debug,windows,messages;|0:|4:type|27: tagMSLLHOOKSTRUCT = record|12: pt:TPoint;|18: mouseData:dword;|14: flags:dword;|13: time:dword;|23: dwExtraInfo:^Cardinal|5: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|26: onMouseMove:THI_Event;|28: onLButtonDown:THI_Event;|26: onLButtonUp:THI_Event;|28: onRButtonDown:THI_Event;|26: onRButtonUp:THI_Event;|26: onWheelDown:THI_Event;|24: onWheelUp:THI_Event;|23: onScroll:THI_Event;|29: onX1ButtonDown:THI_Event;|27: onX1ButtonUp:THI_Event;|29: onX2ButtonDown:THI_Event;|27: onX2ButtonUp:THI_Event;|0:|23: constructor Create;|33: destructor Destroy; override;|0:|5: end;|0:|14:var H:THandle;|20: hac:THiAsmClass;|0:|14:implementation|0:|49:function hook(code,w,l:integer):Lresult; stdcall;|15:var str:string;|25: ll:tagMSLLHOOKSTRUCT;|15: d:LongWord;|5:begin|38: ll := tagMSLLHOOKSTRUCT(pointer(l)^);|0:|26: d := ll.mouseData shr 16;|46: if d and $8000 <> 0 then d := d or $FFFF0000;|0:|10: case w of|36: 512: _hi_OnEvent(hac.onMouseMove);|38: 513: _hi_OnEvent(hac.onLButtonDown);|36: 514: _hi_OnEvent(hac.onLButtonUp);|38: 516: _hi_OnEvent(hac.onRButtonDown);|36: 517: _hi_OnEvent(hac.onRButtonUp);|36: 519: _hi_OnEvent(hac.onWheelDown);|34: 520: _hi_OnEvent(hac.onWheelUp);|45: 522: _hi_OnEvent(hac.onScroll, int2str(d));|12: 523: begin|17: case d of|44: 1: _hi_OnEvent(hac.onX1ButtonDown);|44: 2: _hi_OnEvent(hac.onX2ButtonDown);|12: end;|11: end;|12: 524: begin|17: case d of|42: 1: _hi_OnEvent(hac.onX1ButtonUp);|42: 2: _hi_OnEvent(hac.onX2ButtonUp);|12: end;|11: end;|5: end;|38: result := CallNextHookEx(H,code,w,l);|4:end;|0:|31:constructor THiAsmClass.Create;|5:begin|18: inherited Create;|13: hac := self;|48: H := SetWindowsHookEx(14, @hook, hInstance, 0);|82: if H = 0 then messagebox(ReadHandle,'Ошибка перехвата мыши','ERROR',mb_iconhand);|4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|24: UnhookWindowsHookEx(H);|19: inherited Destroy;|4:end;|0:|4:end.|
}

А что перестаёт работать: https://forum.hiasm.com/topic/67602.

Редактировалось 1 раз(а), последний 2020-09-09 15:57:13
карма: 9
0
Ответов: 17
Рейтинг: 0
#6: 2020-11-07 03:50:26 ЛС | профиль | цитата
3042, Протестирую это решение.
По причине понятно, спасибо.
карма: 0

0
Ответов: 253
Рейтинг: 0
#7: 2024-03-25 16:18:30 ЛС | профиль | цитата
3042 писал(а):
Вот поинтереснее решение:

Подскажите пожалуйста. а можно как то отслеживать направление перемещение курсора. Пытаюсь сделать подобие Remote Play.
Картинку удаленного компьютера на котором запущена игра я вижу, это шутер(стрелялка)
Пытаюсь передавать координаты курсора удаленной машине по tcp
карма: 0

0
Ответов: 8926
Рейтинг: 823
#8: 2024-03-25 19:53:44 ЛС | профиль | цитата
egorhay, есть же "эмулятор мыши"

Add(MainForm,2953706,280,168)
{
Width=300
Height=39
link(onCreate,8124334:doStart,[(319,188)(319,209)(165,209)(165,174)])
}
Add(MouseEvent,10855469,231,112)
{
}
Add(FormatStr,14190185,231,168)
{
Mask="X=%1 Y=%2"
link(onFString,2953706:doCaption,[])
link(Str1,10855469:MouseX,[])
link(Str2,10855469:MouseY,[])
}
Add(Thread,8124334,175,168)
{
Delay=10
link(onExec,14190185:doString,[])
}

карма: 19

0
Ответов: 253
Рейтинг: 0
#9: 2024-03-25 20:07:04 ЛС | профиль | цитата
Леонид писал(а):
эмулятор мыши

Это да, но если ось прёться в 0 то программа не сможет понять, двигаю ли я дальше мышку или она просто в 0.
например развернуться на 360.
Нужно именно направление мыши
карма: 0

0
Ответов: 8926
Рейтинг: 823
#10: 2024-03-25 21:50:56 ЛС | профиль | цитата
egorhay, вспоминается Анналена Бербок
Нынешние мышки делают кадр поверхности и сравнивают с предыдущим уже в компьютере, поэтому из самой мыши эту информацию не получить, надо искать где она обрабатывается, здесь я вам не помощник
Нет, я ошибся, обработка изображения таки в самой мышке, вроде бы, посмотрите здесь, может пригодится
https://habr.com/ru/articles/128972/

Редактировалось 2 раз(а), последний 2024-03-25 22:15:32
карма: 19

0
Ответов: 1926
Рейтинг: 172
#11: 2024-03-26 00:34:25 ЛС | профиль | цитата
egorhay писал(а):
если ось прёться в 0 то программа не сможет понять, двигаю ли я дальше мышку или она просто в 0.

Можно так сделать: как курсор упрётся в 0, программно переместить его в 1, тогда при последующем движении мыши он снова уйдёт в 0, а это уже можно отследить. Только не будет ли дёргаться карта игры...

Редактировалось 2 раз(а), последний 2024-03-26 00:39:36
карма: 9
0
Ответов: 253
Рейтинг: 0
#12: 2024-03-26 11:16:56 ЛС | профиль | цитата
3042 писал(а):
egorhay писал(а):
если ось прёться в 0 то программа не сможет понять, двигаю ли я дальше мышку или она просто в 0.

Можно так сделать: как курсор упрётся в 0, программно переместить его в 1, тогда при последующем движении мыши он снова уйдёт в 0, а это уже можно отследить. Только не будет ли дёргаться карта игры...

Редактировалось 2 раз(а), последний 2024-03-26 00:39:36


Нууу как вариант. Можно попробовать.
Ось X если 0 то -1 (перемещение в лево),
Учесть разрешение экрана, например 1920 x 1080.
И если по оси X 1920 то +1 (перемещение в право)
ну и если вернуться в диапазон от 1 до 1919 то перестаем отнимать или прибавлять соответственно ( чтобы камера бесконечно не убегала влево или в право )

по оси Y аналогично сделать

Может быть и получиться

Пока переключился на попытки реализации это в Python
(правда что то совсем в нем не понимаю)

Пока что вот что вышло

Клиент


from pynput import mouse
import os
import sys
import socket

# Функция преобразования речи в текст


client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 3636))





def on_move(x, y):
print(f"Указатель перемещен на {x, y}")
client.send(f"{x, y}\n".encode())
from_server = client.recv(4096)



def on_click(x, y, button, pressed):
print(f"{'Нажато' if pressed else 'Отпущено'} на {(x, y)}")
client.send(f"{'Нажато' if pressed else 'Отпущено'} на {(x, y)}\n".encode())
from_server = client.recv(4096)
if not pressed:
# Остановить слушатель
return False


def on_scroll(x, y, dx, dy):
print(f"Прокручено {'вниз' if dy < 0 else 'вверх'} на {(x, y)}")

# блок `with` слушает события до выхода


with mouse.Listener(
on_move=on_move,
on_click=on_click,
on_scroll=on_scroll) as listener:
listener.join()

# ...или неблокирующим способом:
listener = mouse.Listener(
on_move=on_move,
on_click=on_click,
on_scroll=on_scroll)
listener.start()


Сервер


import socket
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(('127.0.0.1', 3636))
serv.listen(5)
while True:
conn, addr = serv.accept()
from_client = ''
while True:
data = conn.recv(4096)
if not data: break
from_client += data.decode('utf8')
print (from_client)
conn.send("I am SERVER\n".encode())
conn.close()
print ('client disconnected and shutdown')


Координаты отлично улетаю и за отрицательное число) то есть продолжает показывать движение. И отправляет их серверу по tcp. Правда пока дальше не придумал что делать. надо как-то заставить сервер обрабатывать полученные координаты)
карма: 0

0
Ответов: 793
Рейтинг: 168
#13: 2024-03-26 16:31:37 ЛС | профиль | цитата
egorhay,


Add(MainForm,2953706,497,371)
{
Height=0
}
Add(MouseEvent,10855469,413,301)
{
Point(doPosition)
link(X,1182361:Var,[])
link(Y,7730086:Var,[(433,278)(545,278)])
}
Add(FormatStr,14190185,413,371)
{
DataCount=3
Mask="X=%1 Y=%2"
link(onFString,2953706:doCaption,[])
link(Str1,10222972:Var2,[])
link(Str2,8353328:Var2,[])
}
Add(Screen,9126646,378,105)
{
}
Add(MathParse,8809947,371,189)
{
MathStr="(%1 = 0 ) + (%1 = %2 ) * 2"
ResultType=0
link(onResult,1182361:doIndex,[])
link(X1,4379211:Var2,[])
link(X2,14998375:Var2,[])
}
Add(Timer,2165003,224,357)
{
Interval=100
link(onTimer,11581566:doEvent1,[])
}
Add(Hub,11581566,287,357)
{
OutCount=3
link(onEvent1,8809947:doCalc,[(326,363)(326,195)])
link(onEvent2,5473800:doCalc,[(368,370)(368,237)])
link(onEvent3,14190185:doString,[])
}
Add(GetIndexData,1182361,420,189)
{
Count=3
link(onIndex,10576401:doWork1,[(585,195)])
link(Data1,4379211:Var3,[(426,159)])
link(Data2,14998375:Var3,[(433,145)])
link(Data3,11470477:Var2,[])
}
Add(Memory,4815869,434,105)
{
Default=Integer(0)
}
Add(GetDataEx,14998375,378,140)
{
link(Data,9126646:Width,[])
}
Add(GetDataEx,4379211,371,154)
{
Angle=3
link(Data,10222972:Var1,[(363,159)(363,355)])
}
Add(GetDataEx,10222972,413,350)
{
link(Data,10855469:MouseX,[])
}
Add(MathParse,5473800,490,231)
{
MathStr="(%1 = 0 ) + (%1 = %2 ) * 2"
ResultType=0
link(onResult,7730086:doIndex,[])
link(X1,14002982:Var2,[])
link(X2,2690374:Var2,[])
}
Add(GetIndexData,7730086,539,231)
{
Count=3
link(onIndex,10576401:doWork2,[])
link(Data1,14002982:Var3,[(545,213)])
link(Data2,2690374:Var3,[(552,180)])
link(Data3,11594704:Var2,[])
}
Add(GetDataEx,8353328,420,350)
{
link(Data,10855469:MouseY,[])
}
Add(GetDataEx,14002982,490,208)
{
Angle=3
link(Data,8353328:Var3,[(482,213)(482,355)])
}
Add(GetDataEx,2690374,497,175)
{
Angle=3
link(Data,9126646:Height,[(391,180)])
}
Add(GetDataEx,11470477,434,140)
{
link(Data,4815869:Value,[])
}
Add(If_else,7519778,602,231)
{
Type=5
Op2=Integer(0)
link(onTrue,10855469:doPosition,[(641,237)(641,272)(403,272)(403,321)])
link(Op2,11594704:Var3,[(615,173)])
}
Add(HubEx,10576401,581,231)
{
link(onEvent,7519778:doCompare,[])
}
Add(GetDataEx,11594704,553,168)
{
Angle=3
link(Data,11470477:Var3,[(447,173)(447,145)])
}

карма: 16

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)