[c++] Symulowanie ruchu myszy

0

Witam

Właśnie czytałem sobie o symulowaniu ruchów myszą i natrafiłem na pewien problem i za bardzo nie wiem co jest nie tak.
No więc mam następujący kod:

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <windowsx.h>


using namespace std;

struct MOUSEINPUT
    {
    LONG dx;
    LONG dy;
    DWORD mouseData;
    DWORD dwFlags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
    };

struct INPUT
    {
    DWORD type;
    union
         {
         MOUSEINPUT mi;
         };
    };

int main(int argc, char *argv[])
{

INPUT Ruch;

ZeroMemory (&Ruch, sizeof(INPUT));
// ustawiamy kursor w środku ekranu
Ruch.type = INPUT_MOUSE;
Ruch.mi.dx = 200;   // współ. pozioma
Ruch.mi.dy = 200;   // współ. pionowa
Ruch.mi.dwFlags = MOUSEEVENTF_ABSOLUTE;    // flagi
   SendInput (1, &Ruch, sizeof(INPUT));
system("PAUSE");
return EXIT_SUCCESS;
}

Problemem jest to że nie wiem czemu kompilator (dev-c++) wywala mi błędy:

`INPUT_MOUSE' undeclared (first use this function) 
`SendInput' undeclared (first use this function) 

Co może być nie tak ?

0

Usuń własne definicje INPUT MOUSEINPUT i zobacz :
---TU----

Mały off
Wrócę jeszcze do X-Y myszy tu masz jak to zrobić bez haków i komunikatów :
http://forum.codecall.net/classes-code-snippets/11413-c-mouse-coor.html
Na forum.codecall są jeszcze przykłady do myszy(click) ale tak mi muli internet [ :/ :/ ] że musisz sam poszukać .

0

Dzięki za linki ale jeśli chodzi o wersję bez INPUT-a to jest tam o odczytywaniu danych z kursora co mam już opanowane, bawiłem się też SetCursorPos i nadszedł czas na symulowanie klikania. W kodzie który podesłałem jest ruch myszka bo w ramach frustracji nad problemem skopiowałem dokładnie treść toturiala.
No ale wracając do tematu dodałem definicje makra ale wtedy dostaję błąd:

conflicting declaration 'struct MOUSEINPUT' 
3100 C:\Dev-Cpp\include\winuser.h 'MOUSEINPUT' has a previous declaration as `typedef struct tagMOUSEINPUT MOUSEINPUT' 

i to samo dla INPUT

jeśli usunę Obie struktury (INPUT oraz MOUSEINPUT) to program kompiluje się bez problemu ale nie działa ...

Nawet jeśli zmienię nazwy tych struktur na inne (INPUT na inp a MOUSEINPUT na mouse) to otrzymuję następujący błąd.

 cannot convert `inp*' to `tagINPUT*' for argument `2' to `UINT SendInput(UINT, tagINPUT*, int)'

Jeśli chodzi forum codecall to znalazłem tam jednego posta z podobnym problemem ale bez odpowiedzi :(

0

Ok jest pewien postęp;

Po dodaniu definicji makra i wywaleniu struktur działa (wcześniej miałem tylko flagę MOUSEEVENTF_ABSOLUTE bez MOUSEEVENTF_MOVE) tylko pojawił mi się kolejny problem, Nieważne jakie współrzędne wstawię to ląduje na lewym górnym rogu ekranu, jeśli nie dodam flagi MOUSEEVENTF_ABSOLUTE to kursor przesuwa mi się prawidłowo o wskazaną pozycję, ale co zrobić żeby jednak korzystać z tych współrzędnych absolutnych ?

0

Tak musi chodzić:

#define _WIN32_WINDOWS 0x0410
#define WINVER 0x0410
#include <windows.h>

#include <cstdlib>
using namespace std;

int main(int argc, char *argv[])
{
   INPUT Ruch;

   ZeroMemory (&Ruch, sizeof(INPUT));
   // ustawiamy kursor w środku ekranu
   Ruch.type = INPUT_MOUSE;
   Ruch.mi.dx = 200;   // współ. pozioma
   Ruch.mi.dy = 200;   // współ. pionowa
   Ruch.mi.dwFlags = MOUSEEVENTF_ABSOLUTE;    // flagi
   SendInput (1, &Ruch, sizeof(INPUT));

   system("PAUSE");
   return EXIT_SUCCESS;
}
0

Nie działa bo mi.dx i mi.yx to nie są piksele .
Srodek ekranu to będzie :

   Ruch.type = INPUT_MOUSE;
   Ruch.mi.dx = 65535 / 2;   // współ. pozioma
   Ruch.mi.dy = 65535 / 2;   // współ. pionowa
   Ruch.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE ;    // flagi 

Współrzędne 200,200 będą na ekranie w pobliżu górnego rogu i przesunięcie będzie niewidoczne
Zobacz tu:
MOUSEINPUT

SetCursorPos

//quetz: dokladnie.. dx dy sa pikselami jak mowa o relative

1 użytkowników online, w tym zalogowanych: 0, gości: 1