我怎样才能模拟一个鼠标事件,导致指针向左移动500个像素,然后点击使用C ++。 我将如何做这样的事情?
这里有一些修改后的Win32代码:
#define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0500 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <string.h> #include <windows.h> #define X 123 #define Y 123 #define SCREEN_WIDTH 1024 #define SCREEN_HEIGHT 800 void MouseSetup(INPUT *buffer) { buffer->type = INPUT_MOUSE; buffer->mi.dx = (0 * (0xFFFF / SCREEN_WIDTH)); buffer->mi.dy = (0 * (0xFFFF / SCREEN_HEIGHT)); buffer->mi.mouseData = 0; buffer->mi.dwFlags = MOUSEEVENTF_ABSOLUTE; buffer->mi.time = 0; buffer->mi.dwExtraInfo = 0; } void MouseMoveAbsolute(INPUT *buffer, int x, int y) { buffer->mi.dx = (x * (0xFFFF / SCREEN_WIDTH)); buffer->mi.dy = (y * (0xFFFF / SCREEN_HEIGHT)); buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE); SendInput(1, buffer, sizeof(INPUT)); } void MouseClick(INPUT *buffer) { buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN); SendInput(1, buffer, sizeof(INPUT)); Sleep(10); buffer->mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP); SendInput(1, buffer, sizeof(INPUT)); } int main(int argc, char *argv[]) { INPUT buffer[1]; MouseSetup(&buffer); MouseMoveAbsolute(&buffer, X, Y); MouseClick(&buffer); return 0; }
在使用之前,您需要将MouseSetup()
调用到每个 INPUT
缓冲区。
资源
MSDN –
SendInput()
MSDN –INPUT
MSDN –MOUSEINPUT
以下是使用Linux
人使用Xlib
的解决方案 :
//sg #include <X11/Xlib.h> #include<stdio.h> #include<unistd.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <X11/Xlib.h> #include <X11/Xutil.h> void mouseClick(int button) { Display *display = XOpenDisplay(NULL); XEvent event; if(display == NULL) { fprintf(stderr, "Errore nell'apertura del Display !!!\n"); exit(EXIT_FAILURE); } memset(&event, 0x00, sizeof(event)); event.type = ButtonPress; event.xbutton.button = button; event.xbutton.same_screen = True; XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); event.xbutton.subwindow = event.xbutton.window; while(event.xbutton.subwindow) { event.xbutton.window = event.xbutton.subwindow; XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); } if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n"); XFlush(display); usleep(100000); event.type = ButtonRelease; event.xbutton.state = 0x100; if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n"); XFlush(display); XCloseDisplay(display); } int main(int argc, char * argv[]) { int x , y; x = atoi(argv[1]); y = atoi(argv[2]); Display *display = XOpenDisplay(0); Window root = DefaultRootWindow(display); XWarpPointer(display, None, root, 0, 0, 0, 0, x, y); mouseClick(Button1); XFlush(display); XCloseDisplay(display); return 0; }
只要建立它,然后模拟点击X,Y做:
$ ./a.out xy
即
$g++ -lX11 sgmousesim2.cpp $./a.out 123 13
使用SendInput
来生成你想要模拟的输入。 从MSDN文档:
合成击键,鼠标动作和按钮点击。
C ++本身不能做到这一点。 它没有“鼠标”的概念,更不用说“点击”了。
你需要一些与你的窗口系统对话的库。 例如, QT 。 然后是通过API搜索并进行正确的C ++调用。
我从来没有使用过C ++。 不过,有一个叫做Robot的Java类能够产生鼠标事件。 我在Java 1.4版本中使用过,但它仍然有效。 我尝试了这个模拟在Mac OS X中的物理鼠标移动的例子。 它在MacOSX Lion上与Oracle Java 1.6.0_26平稳运行。 Java的好处在于它是独立于平台的。
import java.awt.AWTException; import java.awt.Robot; public final class MovingMouseDemo { public static void main(String[] args) throws AWTException { Robot robot = new Robot(); robot.setAutoDelay(5); robot.setAutoWaitForIdle(true); //put mouse in the top left of the screen robot.mouseMove(0, 0); //wait so that you can see the result robot.delay(1000); //put the mouse 200 pixels away from the top //10 pixels away from the left robot.mouseMove(200, 10); robot.delay(1000); robot.mouseMove(40, 130); } }
您仍然可以使用JNI将其与C ++绑定。
我希望它有帮助
使用mouse_event函数。