Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Setcursorpos(x, Y)
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - Система
zaoorzo
SetCursorPos(x, y); перемещает курсор на заданную точку,
Почему в Windows Работает а в играх нет?
GRLEX
Мдааа....
ПРочитай есчо раз свой вопрос. Чтоли поконкретнее как нить сформулируй проблему wink.gif
zaoorzo
Вот код моем пррограммы,сначало она запоминает координаты по каторым надо кликать,потом она климает по ним))

Тестировал в 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;
GRLEX
вот набросал побыстрому. У меня на форме есть мемо( я так понял ты с ним работаешь), и кнопка
по нажатию на кнопку делаю следующее
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);
Напиши как ведет себя курсор в твоей программе, Стоит на месте или исчезает может быть?
zaoorzo
это походу не то что мне надо но всеравно спс,мой код работает,только вот в играх где используеться DirectX Курсор не двигается...

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

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


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



Паpаметpы:

wParam: Содержит комбинацию флагов .
lParam: HIWORD - Старшее слово хранит вертикальную координату курсора.
LOWORD - Младшее слово хранит горизонтальную координату курсора.
root
Для: zaoorzo
]]>http://www.gamedev.ru/articles/?id=70105]]>
если актуально
GRLEX
Цитата
Для: zaoorzo
]]>http://www.gamedev.ru/articles/?id=70105]]>
если актуально

По моему в самый раз. Добавить пока нечего.
Задавай вопросы по ходу.
zaoorzo
ох,там на си,и кусок на 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;
  };
};
GRLEX
Попробуй, как вариант создать таймер, и в определенный момент посылать главному окну
событие 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.
sax_ol
Для: zaoorzo
Вы тут пишете "мне подсказали". а в другом месте "я нашел", ай ай ай wink.gif
zaoorzo
Это в каком месте?)delphimaster ру ? smile.gif

Я почти на всех форумах спросил) никто толком не ответил,а вотт тут помогли,завтра надо будет попробовать все то что написано выше)
root
Для: zaoorzo
]]>http://www.netlib.narod.ru/library/book0051/toc.htm]]> работа с directX
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.