Эмуляция мыши в неактивном окне.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Эмуляция мыши в неактивном окне.

Сообщение Ruslan2000 » 26.07.2008 (Сб) 20:53

Привет всем. Подскажите пжалста, кто сталкивался с вопросом эмуляции движения мыши в НЕАКТИВНОМ окне.
пробовал писать типа:
t = PostMessage(WindowHandle, WM_MOUSEMOVE, 0, &HFF00F)
не работает.

или нужен вариант, как эмулировать клик кнопкой мыши в точке с заданными координатами в неактивном окне.
Пробовал такие строки, задавая в Lparam разные значения:
t = PostMessage(WindowHandle, WM_RBUTTONDOWN, 0, Lparam)
t = PostMessage(WindowHandle, WM_RBUTTONUP, 0, Lparam)
кликает только в том месте где стоит курсор, не перемещая его в нужное место и то только если курсор стоит в области окна хендл которого передается в Postmessage.
А как сделать перемещение или клик для окна которое например свернуто в трее?
Винда ХР.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 26.07.2008 (Сб) 23:03

А как сделать перемещение или клик для окна которое например свернуто в трее?


Вот это совсем непонятно... Зачем и как это ты собираешься перемещать свернутую форму??? :shock:

И что это будет за точка с заданными координатами по которой нужно кликнуть??? Если это объект, то у него свой хэндл будет, к нему и посылку делай...
Только лучше, я думаю, использовать SendMessage вместо PostMessage. Разница в том, что первый... выполняется немедленно, а второй - ставится в очередь сообщений...

Вообщем, изъясни цели подробней.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 26.07.2008 (Сб) 23:58

Только лучше, я думаю, использовать SendMessage вместо PostMessage. Разница в том, что первый... выполняется немедленно, а второй - ставится в очередь сообщений...


Не правильно. Второй не ставится в очередь, ставятя в очередь сообщения, отправляемые этими функциями. И они ставятся туда в любом случае: хоть SendMessage используй, хоть PostMessage.

Разница в том, что SendMessage ставит сообщение в очередь, и ожидает, пока это сообщение не обработают. А PostMessage ставит сообщение в очередь, и возвращает выполнение к коду, вызвавшему его, сразу же, без всякого ожидания.

Т.е., awl100Alex, даже если не смотреть на ошибки в терминалогии и понимании, ты их всё равно местами перепутал.

Ruslan2000
Пробовал такие строки, задавая в Lparam разные значения:

Расскажи нам, пожалуйста, какие разные значения ты передавал?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Сообщение Ruslan2000 » 27.07.2008 (Вс) 0:16

2awl100Alex
Я имел ввиду - как сделать эмуляцию перемещения мыши для процесса который свернут? Это нужно для того чтобы засунуть в один компьютер несколько пар программ клиент игры+бот. Управление клиентом осуществляется посредством посылки ему сообщений эмуляции клавы и мыши. Но рализовано это пока только для активного окна игры, через mouse_event и keybd_vent. Соответсвенно получается - один комп - одна пара программ игра+бот. А системники уже в комнате не помещаются. Бот это програмный робот управляющий персонажами в игре, если вдруг кто не знает.

Окно с графикой, никахих дочерних объектов имеющих собственный хендл.

2Хакер
Если я правильно понимаю lparam это 8 байт, первые четыре должны содержать координату-х в системе 0 - 65535, а вторые соответсвенно коорд. - у. Или наоборот, не суть важно. Поэтому, точка с коорд 255,255 в области окна (которое занимает четверть рабочего стола) должна выглядеть как lparam=&H000F000F.
Я пробовал ставить значения &H000F000F, &H7D007D00 + другие прмежуточные между &HFFFFFFFF и &H00000001. Бесполезно, курсор не менял своей позиции.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Сообщение awl100Alex » 27.07.2008 (Вс) 1:10

Разница в том, что SendMessage ставит сообщение в очередь, и ожидает, пока это сообщение не обработают. А PostMessage ставит сообщение в очередь, и возвращает выполнение к коду, вызвавшему его, сразу же, без всякого ожидания.


Согласен... Просто эти тонкости я опустил и сказал в "двух словах" как получилось...

Ruslan2000
как сделать эмуляцию перемещения мыши для процесса который свернут?


Если свернут... думаю никак... Хотя может есть какие-нибудь Хакер(!)ские приемы... :wink:

Окно с графикой, никахих дочерних объектов имеющих собственный хендл.


От куда такое твердое убеждение??? :shock: Получается, что ты кликаешь мышкой в некой "пустой" области, которая вызывает процедуру добавления Бота... Опиши, что за "точка"...
Последний раз редактировалось awl100Alex 27.07.2008 (Вс) 1:32, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.07.2008 (Вс) 1:22

Согласен... Просто эти тонкости я опустил и сказал в "двух словах" как получилось...


Ты тонкости опустил, но всё равно перепутал функции: у тебя получилось, что Post ждёт, а Send -- не ждёт, хотя на самом деле, всё наоборот.

Если свернут... думаю никак... Хотя может есть какие-нибудь Хакер(!)ские приемы...

Даже если свёрнут, то (если окно не проверяет, а свёрнуто ли оно и не отторгает сообщения о кликах в этом случае) -- ещё как. Но даже если оно действительно не реагирует на сообщения в случае свёрнутости, то хакерские способы всё равно есть.

От куда такое твердое убеждение???

Видимо, от программы Spy++ или его аналогов?

Если я правильно понимаю lparam это 8 байт

Нет, это 4 байта.

первые четыре должны

... первые два ... и вторые два...

0 - 65535, а вторые соответсвенно коорд. - у. Или наоборот, не суть важно.

Нижнее слово -- Х, верхнее слово - Y.

Поэтому, точка с коорд 255,255 в области окна (которое занимает четверть рабочего стола) должна выглядеть как lparam=&H000F000F.

Нет, &h000F000F это точка с координатами (15; 15).

Я пробовал ставить значения &H000F000F, &H7D007D00 + другие прмежуточные между &HFFFFFFFF и &H00000001.

А зачем? &h[0400][0400] это уже (1024; 1024). Какой смысл использовать такие большие числа?

Бесполезно, курсор не менял своей позиции.

Курсор и не должен менять свою полизцию. Ты же эмулируешь мышиные события, а не воспроизводишь их.
Сам курсор должен оставаться там, где он есть, а программа будет думать, что курсор бегает над её окном и что-то в нём кликает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Сообщение Ruslan2000 » 06.08.2008 (Ср) 3:21

Спасибо за советы. Ковыряю дальше.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Эмуляция мыши в неактивном окне.

Сообщение djalex777 » 24.08.2008 (Вс) 13:34

Создал форму (Form1), на ней кнопку (Command1). Эмулирую "кликанье" левой кнопкой мышки в точке, расположенной на Command1 (x,y)

Код: Выделить всё
...
PostMessage(Form1.hwnd, WM_MOUSEDOWN, MakeLong(x,y))
PostMessage(Form1.hwnd, WM_MOUSEUP, MakeLong(x,y))
...


И ничего не происходит. Т.е. получается эмуляция события происходит только на объекте, чей hwnd передается в функцию?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Эмуляция мыши в неактивном окне.

Сообщение Хакер » 24.08.2008 (Вс) 13:40

Т.е. получается эмуляция события происходит только на объекте, чей hwnd передается в функцию?

Разумеется (если закрыть глаза на ошибки).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Эмуляция мыши в неактивном окне.

Сообщение djalex777 » 24.08.2008 (Вс) 14:39

Хм.. Создаю объект InternetExplorer (ie). Эмулирую событие:

Код: Выделить всё
...
x=10
y=10
SendMessage ie.hwnd, WM_RBUTTONDOWN, 0, MakeLong(X, Y)
SendMessage ie.hwnd, WM_RBUTTONUP, 0, MakeLong(X, Y)
...


И ничего не происходит. По логике должно появиться выпадающее меню Internet explorer, но этого не происходит. Что я не так делаю?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Эмуляция мыши в неактивном окне.

Сообщение Хакер » 24.08.2008 (Вс) 14:41

Не тому окну шлёшь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ruslan2000
Новичок
Новичок
Аватара пользователя
 
Сообщения: 32
Зарегистрирован: 27.09.2007 (Чт) 14:45
Откуда: Питер

Re: Эмуляция мыши в неактивном окне.

Сообщение Ruslan2000 » 27.10.2008 (Пн) 0:13

Хотелось бы воскресить тему, поскольку задача не была решена.
Окно для которого надо сделать эмуляцию, имеет класс GxWindowClassD3D, дочерние окна отсутствуют (по сообщению spy++).
При движении мышкой ручками над этим НЕАКТИВНЫМ окном, Spy++ выдает следующий лог(привожу кусок многократно повторяющегося лога в котором меняется только x и y):

<00010> 001002C8 P message:0x02A2 [Unknown] wParam:00000000 lParam:00000000

<00235> 001002C8 S WM_NCHITTEST xPos:370 yPos:415
<00236> 001002C8 R WM_NCHITTEST nHittest:HTCLIENT
<00237> 001002C8 S WM_NCHITTEST xPos:370 yPos:415
<00238> 001002C8 R WM_NCHITTEST nHittest:HTCLIENT
<00239> 001002C8 S WM_SETCURSOR hwnd:001002C8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00240> 001002C8 R WM_SETCURSOR fHaltProcessing:True
<00241> 001002C8 P WM_MOUSEMOVE fwKeys:0000 xPos:369 yPos:386

При этом 3D-окно реагирует на движение мыши, как должно (менятся курсор, выпадают подсказки и активируются менюшки).

Пишу:

Xx=369
Yy=386

SendMessage WindowHandle, WM_NCHITTEST, 0, MakeLong(xx, yy)
SendMessage WindowHandle, WM_NCHITTEST, 0, MakeLong(xx, yy)
SendMessage WindowHandle, WM_SETCURSOR, WindowHandle, &H2000001
PostMessage WindowHandle, WM_MOUSEMOVE, 0, MakeLong(xx, yy)

После запуска этого, spy выдает лог 100% идентичный ранее полученному (x и y значения не имеют), но приложение абсолютно никак не реагирует на сообщения движения мыши.


Таже самая история с нажатием кнопки мыши. При посылке набора сообщений типа следующего, реакции никакой, хотя лог совпадает:
SendMessage WindowHandle, WM_NCHITTEST, 0, MakeLong(xx, yy)
SendMessage WindowHandle, WM_NCHITTEST, 0, MakeLong(xx, yy)
SendMessage WindowHandle, WM_SETCURSOR, WindowHandle, &H2000001
PostMessage WindowHandle, WM_MOUSEMOVE, 0, MakeLong(xx, yy)
PostMessage WindowHandle, WM_RBUTTONDOWN, 0, MakeLong(xx, yy)
PostMessage WindowHandle, WM_RBUTTONUP, 0, MakeLong(xx, yy)


Есть одна странность: если выполнить
Sleep 5000
PostMessage WindowHandle, WM_MOUSEMOVE, 0, MakeLong(xx, yy)
PostMessage WindowHandle, WM_RBUTTONDOWN, 0, MakeLong(xx, yy)
PostMessage WindowHandle, WM_RBUTTONUP, 0, MakeLong(xx, yy)

и за время паузы поставить курсор в область 3D-окна не делая его активным, выполняется щелчок правой кнопкой мыши в том месте, где стоит курсор не зависимо от того, что указано в xx и уу. При этом приложение остается неактивным и логе отсутствуют какие либо сообщения об активации окна. Окно реагирует на клик так как должно.
Первое что приходит в голову, это что 3D-приложение проверяет реальные координаты курсора и сравнивает их с полученным сообщением. Далее игнорит его из-за несовпадения координат. Хотя вероятно это домыслы.
PostMessage тестил на простых окнах типа калькулятора – все отлично работает и щелкает, там где надо.

Какие есть способы решить задачу?
Как вариант - можно пригласить попа, освятить комп, вдруг это демоны?

EvgenyZ
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.12.2009 (Сб) 23:19

Re: Эмуляция мыши в неактивном окне.

Сообщение EvgenyZ » 26.12.2009 (Сб) 23:36

Хочу воскресить тему. У меня сейчас точно такая же задача и точно такая же проблема. Я еще заметил, что если перед окном игры поставить окно любой другой программы и двигать на нем курсор, то в игре курсор тоже двигается. Пожалуйста момогите решить эту задачу.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 27.12.2009 (Вс) 2:38

EvgenyZ
Скорее всего у Ruslan2000 в коде были ошибки либо в неправильном значении хэнла (WindowHandle) - сообщение посылалось непонятно куда, либо, что более вероятно, в применении функции MakeLong для передачи координат.
Вместо MakeLong лучше записать так...
Код: Выделить всё
X%=369
Y%=386
Res& = ((Y * 65536) + X)

Что, собственно говоря, подтверждается экспериментально...
Код: Выделить всё
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202

Private Sub Command1_Click()
    X% = 369
    Y% = 386
    Res& = ((Y * 65536) + X)
    SendMessage Me.hwnd, WM_LBUTTONDOWN, 0, ByVal Res&
    SendMessage Me.hwnd, WM_LBUTTONUP, 0, ByVal Res&
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Me.Caption = X \ Screen.TwipsPerPixelX & " " & Y \ Screen.TwipsPerPixelY
End Sub

Попробуй переделать это относительно твоей задаче с игрой. Если не сработает, значит проблема с корректностью хэнла, которому посылается сообщение.

EvgenyZ
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.12.2009 (Сб) 23:19

Re: Эмуляция мыши в неактивном окне.

Сообщение EvgenyZ » 27.12.2009 (Вс) 17:59

Spy++ показывает один и тот же лог когда я посылаю сообщения окну игры и когда над ним реально движется курсор и хэндл там один и тот же, об этом писал Ruslan2000. Более того на меню игры в нижней части окна, а также на меню диалогов с персонажами игры курсор двигается и кнопки нажимаются, а вот на самом игровом поле - НЕТ.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 28.12.2009 (Пн) 13:18

EvgenyZ писал(а):...хэндл там один и тот же...

Хэндл изменчивый, как женщина, он не может быть всегда один и тот же. Он всегда уникален! Ruslan2000 писал про класс GxWindowClassD3D и что дочерние окна у него отсутствуют. Вот эти самые имена классов, как правило, всегда постоянны, но могут повторятся n-ое количество раз. К примеру, может быть так...
GxWindowClass - родительский класс
- GxWindowClassD3D
- GxWindowClassD3D
- GxWindowClassD3D
- GxWindowClassD3D
- GxWindowClassD3D
– это нужным нам дочерний класс.
Отправленное сообщение окну и именем класса GxWindowClassD3D примет первый... вместо последнего, который, к примеру, является окном поля игры. Нужно точно знать для какого окна с именем класса GxWindowClassD3D нужно отправить сообщение, и если он окажется, например, последним (пятым), то для получения хэнла этого класса для функции отправки сообщений (где нужно подставлять хэндл) окнам имеющим класс GxWindowClassD3D тебе нужно перебрать их все через FindWindowsEx.
Последний раз редактировалось awl100Alex 28.12.2009 (Пн) 17:26, всего редактировалось 1 раз.

EvgenyZ
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.12.2009 (Сб) 23:19

Re: Эмуляция мыши в неактивном окне.

Сообщение EvgenyZ » 28.12.2009 (Пн) 15:03

Посмотрел список дочерних классов окна игры, там нет класса GxWindowClassD3D. Там более ста классов Tedit и все. Мне нужно посылать сообщения одному из них? Client Rect у них 0x0.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Эмуляция мыши в неактивном окне.

Сообщение Хакер » 28.12.2009 (Пн) 15:26

Что за чушь вы тут несёте? Один про посылку сообщений хендлам, другой про посылку сообщеий классам, третий про дочерние классы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 28.12.2009 (Пн) 17:31

EvgenyZ писал(а):Посмотрел список дочерних классов окна игры, там нет класса GxWindowClassD3D. Там более ста классов Tedit и все. Мне нужно посылать сообщения одному из них?

Вообщем-то да... Нужно знать какое окно имеющее класс Tedit является полем игры. Вот ему и оправлять сообщение.
Последний раз редактировалось awl100Alex 28.12.2009 (Пн) 18:34, всего редактировалось 1 раз.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 28.12.2009 (Пн) 17:33

Вообще, трудно что-либо говорить дистанционно... не имея этой игры под рукой. Может получится "испорченный телефон". :(

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 28.12.2009 (Пн) 18:44

EvgenyZ
Возникла идея...
К примеру, Spy++ у тебя возвращает что-то типа такого...

<00235> 001002C8 S WM_NCHITTEST xPos:370 yPos:415
<00236> 001002C8 R WM_NCHITTEST nHittest:HTCLIENT
<00237> 001002C8 S WM_NCHITTEST xPos:370 yPos:415
<00238> 001002C8 R WM_NCHITTEST nHittest:HTCLIENT
<00239> 001002C8 S WM_SETCURSOR hwnd:001002C8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00240> 001002C8 R WM_SETCURSOR fHaltProcessing:True
<00241> 001002C8 P WM_MOUSEMOVE fwKeys:0000 xPos:369 yPos:386

НЕ закрывая окна игры, попробуй взять текущий хэндл окна «hwnd:001002C8» и подставить «001002C8» в SendMessage... послать ему пару таких же сообщений. Пронаблюдай за поведением окна.

EvgenyZ
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.12.2009 (Сб) 23:19

Re: Эмуляция мыши в неактивном окне.

Сообщение EvgenyZ » 28.12.2009 (Пн) 20:31

awl100Alex писал(а):Возникла идея...
К примеру, Spy++ у тебя возвращает что-то типа такого...

<00235> 001002C8 S WM_NCHITTEST xPos:370 yPos:415
<00236> 001002C8 R WM_NCHITTEST nHittest:HTCLIENT
<00237> 001002C8 S WM_NCHITTEST xPos:370 yPos:415
<00238> 001002C8 R WM_NCHITTEST nHittest:HTCLIENT
<00239> 001002C8 S WM_SETCURSOR hwnd:001002C8 nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
<00240> 001002C8 R WM_SETCURSOR fHaltProcessing:True
<00241> 001002C8 P WM_MOUSEMOVE fwKeys:0000 xPos:369 yPos:386

НЕ закрывая окна игры, попробуй взять текущий хэндл окна «hwnd:001002C8» и подставить «001002C8» в SendMessage... послать ему пару таких же сообщений. Пронаблюдай за поведением окна.


Да Spy++ показывает именно такое.
Я так делал, и когда посылал сообщения spy++ показывал тоже самое, однако курсор на игровом поле не двигался.
По поводу дочерних окон Tedit - у них размер 0x0, врядли это игровое поле.

Хакер писал(а):Что за чушь вы тут несёте? Один про посылку сообщений хендлам, другой про посылку сообщеий классам, третий про дочерние классы.


Мы тут не терминологию обсуждаем, понятно что сообщения посылаются не хэндлам. Лучше бы помог, чем критиковать.

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Эмуляция мыши в неактивном окне.

Сообщение alex77755 » 28.12.2009 (Пн) 21:21

Лучше бы помог, чем критиковать

Справедливо

EvgenyZ
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.12.2009 (Сб) 23:19

Re: Эмуляция мыши в неактивном окне.

Сообщение EvgenyZ » 28.12.2009 (Пн) 21:26

Как я уже говорил объекты в игре подсвечиваются даже если водить курсором на окне, которое стоит перед окном игры. Сообщения WM_MOUSEMOVE при этом окну игры не посылаются. Если посылать сообщение WM_LBUTTONDOWN, то персонаж всегда двигается в направлении курсора независимо от передаваемых координат и идаже если окно игры не активно и курсор за пределами окна. Наверно все-таки игра отсеживает реальное положение курсора.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Эмуляция мыши в неактивном окне.

Сообщение Хакер » 29.12.2009 (Вт) 1:18

Невозможно помочь людям, которые занимаются ерундой и у которых беспорядок в головах.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 29.12.2009 (Вт) 11:16

Хакер писал(а):Невозможно помочь людям, которые занимаются ерундой

В чем ерунда?..
EvgenyZ писал(а):Наверно все-таки игра отслеживает реальное положение курсора

Вполне может быть. Что могло помешает программистам игры использовать, как бы они посчитали - более надежным/удобным/лучшим/прикольным/афигенным, черт его знает еще каким-то, например, такой алгоритм взаимодействия с пользователем?..
Код: Выделить всё
Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
Private Const Invert = 1
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type

Private Sub Timer1_Timer() '120 мсек...
Dim CurPos As POINTAPI
GetCursorPos CurPos
Caption = "X = " & CurPos.x & " " & "Y = " & CurPos.y
Select Case CurPos.x
  Case 100 To 200
   Select Case CurPos.y
    Case 100 To 200: FlashWindow hwnd, Invert
   End Select
End Select
End Sub

Этот код по действию является подобным описанию...
EvgenyZ писал(а):Как я уже говорил объекты в игре подсвечиваются даже если водить курсором на окне, которое стоит перед окном игры...
EvgenyZ писал(а):...и даже если окно игры не активно и курсор за пределами окна.

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

Тогда и очередь сообщений от периферии типа WM_MOUSEMOVE, рассылаемые системой и то, что показывает Spy++, в игре будут просто частично игнорироваться - это объясняет то, что писал Ruslan2000...
Ruslan2000 писал(а):...но приложение абсолютно никак не реагирует на сообщения движения мыши.

Что мешает поместить такой же код в процедуру обработки кликов WM_LBUTTONDOWN/WM_LBUTTONUP в игре?
Последний раз редактировалось awl100Alex 29.12.2009 (Вт) 21:45, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Эмуляция мыши в неактивном окне.

Сообщение Хакер » 29.12.2009 (Вт) 14:48

Ерунда в постановке задачи, в самой задаче и в стратегии поиска её решения. Иными словами, во-всём, что есть в этой теме.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EvgenyZ
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 26.12.2009 (Сб) 23:19

Re: Эмуляция мыши в неактивном окне.

Сообщение EvgenyZ » 29.12.2009 (Вт) 18:40

Хакер писал(а):Ерунда в постановке задачи, в самой задаче и в стратегии поиска её решения. Иными словами, во-всём, что есть в этой теме.

Тебе не нравится постановка задачи, стратегии поиска её решения. Зачем ты вообще залез в эту тему?
Решаем задачу как можем. Если бы я все знал, я бы тогда ничего не спрашивал.
Ты уж если не помогаешь, тогда хотябы не мешай.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Эмуляция мыши в неактивном окне.

Сообщение Хакер » 29.12.2009 (Вт) 19:35

Зачем ты вообще залез в эту тему?

Таков принцип работы форума, что любой пользователь вправе залезать в любую тему по собственному желанию.

Решаем задачу как можем. Если бы я все знал, я бы тогда ничего не спрашивал.

Конечно, но проблема в том, что невозможно заочно узнать все необходимые сведения для решения всех потециально возможных проблем. Так что надо уметь находить знания.

А задачу вы не решаете, у вас задачи-то четко сформулированной нигде нет. Так только, болтовня, установление причины смерти по детской фотографии.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Эмуляция мыши в неактивном окне.

Сообщение awl100Alex » 29.12.2009 (Вт) 21:47

Как быть в такой ситуации? Вопрос конечно интересный. Видимо потому Ruslan2000 забросил эту тему посчитав, что ничего тут не сделать и никакие Хакер’ы ему не помогут. :(

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList