Setcursorpos(x, Y)

  • Автор темы zaoorzo
  • Дата начала
Z

zaoorzo

#1
SetCursorPos(x, y); перемещает курсор на заданную точку,
Почему в Windows Работает а в играх нет?
 
G

GRLEX

#2
Мдааа....
ПРочитай есчо раз свой вопрос. Чтоли поконкретнее как нить сформулируй проблему :)
 
Z

zaoorzo

#3
Вот код моем пррограммы,сначало она запоминает координаты по каторым надо кликать,потом она климает по ним))

Тестировал в Windows(Просто сохранил координаты чтоб моя программа сама щелкала по папкам)
тестировал на Paint(Сохранил коррдинаты ,программа тыкала кисточкой в те координаты)
тоесть программа работает с Windows...курсор передвигаеться и мышка нажимаеться,
Вот попробовал сделать то же самое только в игре,
и ничего не получилось...Курсор не передвигаеться,но мышка нажимаеться...
вопрос в следующем...Почему в "Paintи и в Windows"курсор передвигает,а в игре нет?
Код:
procedure PMouseDown(x,y: integer);
var
OldCursorPos: TPoint;
begin
//направляем мышкой и тыкаем кнопку
GetCursorPos(OldCursorPos);
SetCursorPos(x, y);
mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);
SetCursorPos(OldCursorPos.X, OldCursorPos.Y);
end;

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
OldCursorPos: TPoint;
begin
//сохраняем позиции
if (GetAsyncKeyState(VK_LBUTTON) <> 0) and (GetAsyncKeyState(vk_Shift) <> 0) then begin
GetCursorPos(OldCursorPos);
memo1.lines.add(inttostr(OldCursorPos.X)+':'+inttostr(OldCursorPos.y));
end;
end;

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
i,ckl2,pos1,pos2: integer;
h: HWND;
begin
//начать кликать
for ckl2:= 1 to strtoint(edit2.text)do begin
h:=FindWindow(nil,pchar(form1.edit1.text));
if h <> 0 then begin
//ShowWindow(h, SW_MAXIMIZE);


SetForegroundWindow(h);
for i:= 0 to memo1.lines.Count-1 do begin

If Pos('stop', memo1.lines[i]) <> 0 then begin
pos1:=pos('(',memo1.Lines[i]);
pos2:=pos(')',memo1.Lines[i]);
sleep(strtoint(copy(memo1.Lines[i],pos1+1,pos2-pos1-1)));

end
else
begin
pos1:=pos(':',memo1.Lines[i]);
PMouseDown(strtoint(copy(memo1.Lines[i],1,pos1-1)),strtoint(copy(memo1.Lines[i],pos1+1,length(memo1.Lines[i])-pos1)));
end;
end;
end;
end;
 
G

GRLEX

#4
вот набросал побыстрому. У меня на форме есть мемо( я так понял ты с ним работаешь), и кнопка
по нажатию на кнопку делаю следующее
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var OldPos, NewPos : TPoint;
h : HWND;
begin
GetCursorPos(OldPos);
{
К примеру нада поставить курсор в мемо на координаты х = 120
у = 43
}
// задаем необходимые координаты
NewPos.X := 120;
NewPos.Y := 43;
// преобразовываем их для мемо
NewPos :=Memo1.ClientToScreen(NewPos);
// устанавливаем курсор
SetCursorPos(NewPos.X,newpos.Y);
//подождем малость
sleep(1000);
//возвращаем назад курсор
SetCursorPos(OldPos.X, OldPos.Y);
end;
курсор перескакивает на мемо без проблем, и возвращаетсо назад.
Быть может не хватало
// преобразовываем их для мемо
NewPos :=Memo1.ClientToScreen(NewPos);
Напиши как ведет себя курсор в твоей программе, Стоит на месте или исчезает может быть?
 
Z

zaoorzo

#5
это походу не то что мне надо но всеравно спс,мой код работает,только вот в играх где используеться DirectX Курсор не двигается...

Мне тут подсказали:

Эмулируй WM_MOUSEMOVE - игры следят за разностью координат, а не за абсолютными координатами, которые изменяет SetCursorPos.


как использовать этот WM_MOUSEMOVE ,думаю надо отправлять через Sendmessage окну...
Но как это записать незнаю



Паpаметpы:

wParam: Содержит комбинацию флагов .
lParam: HIWORD - Старшее слово хранит вертикальную координату курсора.
LOWORD - Младшее слово хранит горизонтальную координату курсора.
 
Z

zaoorzo

#8
ох,там на си,и кусок на delphi,не понятно)

class MSMessageMouse:public MouseDevice
это типа как функция\процедура в делфи?)

Походу ту программа,следит за координатами и записывает их,
а мне надо перемещать курсор,
вот это?
PeekMessage(&Msg, WndHandle, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) && m<Info.MaxNum)
только надо
Sendmessge(h,WM_MOUSEFIRST, WM_MOUSELAST, WM_MOUSEMOVE,X,Y);
или как чет вообще не понимаю че там)
Если не сложно напишите примерчик,только чтоб перемещал курсор )


Код:
class MSMessageMouse:public MouseDevice
{
private:
char ButtonState[8]; //сотояние кнопок мышки
HWND WndHandle;
int ox, oy;		 //Предыдущая позиция курсора
public:
stMSMessageMouse()
{
ZeroMemory(ButtonState, 8);
};

void Init(HWND h_Wnd)
{
WndHandle=h_Wnd;
//Возьмем начальную точку курсора
tagPOINT p;
GetCursorPos(&p);
ox=p.x;
oy=p.y;
};

void Done(){};

void ReadData(MouseInfo &Info)
{
MSG Msg;
int m=0;

int lX, lY;
while(PeekMessage(&Msg, WndHandle, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) && m<Info.MaxNum)
{ 
TranslateMessage(&Msg);
switch (Msg.message)
{
case WM_MOUSEMOVE:
//Мы будем оперировать не с глобальными координатами курсора 
//как делает винда, а с пиращениями координат в каждый тик.
lX=LOWORD(Msg.lParam)-ox;
lY=HIWORD(Msg.lParam)-oy;

//заполним смещение по осям		
Info.Axis[0]=lX;
Info.Axis[1]=lY;
Info.Axis[2]=0;

//Если мышка изменила координату по x, то добавим соответствующее сообщение
if(lX)
{
Info.Msg[m].Event=id_MoveX;
Info.Msg[m].Value=lX;
m++;
};

//Если мышка изменила координату по y, то добавим соответствующее сообщение
if(lY)
{
Info.Msg[m].Event=id_MoveY;
Info.Msg[m].Value=lY;
m++;
};

//Запомним координаты курсора для вычисления пиращения в следующем кадре
ox=LOWORD(Msg.lParam);
oy=HIWORD(Msg.lParam);
break;

//Для любителей Delphi6, там есть этот меседж и работает он только под NT, в cpp6 его нету. 
// И как брать скролл я не знаю.
//	 case WM_MOUSEWHEEL:
//		Info.Msg[m].Event=id_MoveZ;
//		Info.Msg[m].Value=HIWORD(Msg.wParam);
//		m++;
//		break;
//
// Обработка кнопок. Поступаем точно так-же как и с клавиатурой, 
// только тут для каждой кнопки свой меседж.
case WM_LBUTTONDOWN:  
ButtonState[0]=1;
Info.Msg[m].Event=id_ButtonDown;
Info.Msg[m].Value=0;
m++;
break;

case WM_LBUTTONUP:
ButtonState[0]=0;
Info.Msg[m].Event=id_ButtonUp;
Info.Msg[m].Value=0;
m++;
break;
//Аналогично обрабатываются WM_RBUTTONUP, WM_RBUTTONDOWN, WM_MBUTTONUP и WM_MBUTTONDOWN..
//для WM_RBUTTON Value=1, а для WM_MBUTTON Value=2.
};

memcpy(Info.ButtonState, ButtonState, 8); //Передаем состояние кнопок.
Info.MsgNum=m;
};
};
 
G

GRLEX

#9
Попробуй, как вариант создать таймер, и в определенный момент посылать главному окну
событие WM_MOUSEMOVE.
И есчо перехвати процедуру обработки главного окна
Код:
procedure TMainForm.WndProc(var Message: TMessage);
begin
//тут обрабатывае события
case( Message.WParam )of

WM_MOUSEMOVE: Begin
// тут обрабатываешь все как хочешь ты
// можешь сам принудительно двигать мышь куда угодно
// когда сработает это событие - в параметре
// lParam будут текущие координаты мыши
end;
end;//case			 
inherited;
end;
Это то что по этому поводу в MSDN есть
Код:
[u]WM_MOUSEMOVE Notification[/u]

--------------------------------------------------------------------------------


The WM_MOUSEMOVE message is posted to a window when the cursor moves. If the mouse is not captured, the message is posted to the window that contains the cursor. Otherwise, the message is posted to the window that has captured the mouse.

A window receives this message through its WindowProc function. 


Syntax

WM_MOUSEMOVE

WPARAM wParam
LPARAM lParam;

Parameters

wParam
Indicates whether various virtual keys are down. This parameter can be one or more of the following values. 
MK_CONTROL
The CTRL key is down.
MK_LBUTTON
The left mouse button is down.
MK_MBUTTON
The middle mouse button is down.
MK_RBUTTON
The right mouse button is down.
MK_SHIFT
The SHIFT key is down.
MK_XBUTTON1
Windows 2000/XP: The first X button is down.
MK_XBUTTON2
Windows 2000/XP: The second X button is down.
lParam
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area. 

The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area. 
Return Value

If an application processes this message, it should return zero.
 
Z

zaoorzo

#10
Это в каком месте?)delphimaster ру ? :(

Я почти на всех форумах спросил) никто толком не ответил,а вотт тут помогли,завтра надо будет попробовать все то что написано выше)