Setcursorpos(x, Y)

Тема в разделе "Delphi - Система", создана пользователем zaoorzo, 24 дек 2007.

  1. zaoorzo

    zaoorzo Гость

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

    GRLEX Гость

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

    zaoorzo Гость

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

    Тестировал в Windows(Просто сохранил координаты чтоб моя программа сама щелкала по папкам)
    тестировал на Paint(Сохранил коррдинаты ,программа тыкала кисточкой в те координаты)
    тоесть программа работает с Windows...курсор передвигаеться и мышка нажимаеться,
    Вот попробовал сделать то же самое только в игре,
    и ничего не получилось...Курсор не передвигаеться,но мышка нажимаеться...
    вопрос в следующем...Почему в "Paintи и в Windows"курсор передвигает,а в игре нет?
    Код (Text):
    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;

    Код (Text):
    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;

    Код (Text):
    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;
     
  4. GRLEX

    GRLEX Гость

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

    zaoorzo Гость

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

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

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


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



    Паpаметpы:

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

    root Гость

  7. GRLEX

    GRLEX Гость

    По моему в самый раз. Добавить пока нечего.
    Задавай вопросы по ходу.
     
  8. zaoorzo

    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);
    или как чет вообще не понимаю че там)
    Если не сложно напишите примерчик,только чтоб перемещал курсор )


    Код (Text):
    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;
    };
    };
     
  9. GRLEX

    GRLEX Гость

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

    WM_MOUSEMOVE: Begin
    // тут обрабатываешь все как хочешь ты
    // можешь сам принудительно двигать мышь куда угодно
    // когда сработает это событие - в параметре
    // lParam будут текущие координаты мыши
    end;
    end;//case           
    inherited;
    end;
    Это то что по этому поводу в MSDN есть
    Код (Text):
    [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.
     
  10. zaoorzo

    zaoorzo Гость

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

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

    root Гость

Поделиться этой страницей