wickss Posted March 30, 2009 Posted March 30, 2009 I am using AutoItX in VB.net. I need to have my program click at certain coordinates in a window. If I use MouseClick, it moves the mouse cursor. I don't want to have to save the mouse position, click, and then move the cursor back because that will have less than professional feel. I want to use ControlClick, but the click isn't going to a windows control. If I leave out the control name it doesn't seem to do anything. Is there any thing I am missing? AutoIT.ControlClick(hwnd, "", "", , , X, Y) My last resort will be to use SendMessage. But I don't know which message to send.
Authenticity Posted March 31, 2009 Posted March 31, 2009 With the help of http://www.codeguru.com/forum/showthread.php?t=377394 great resource.It's still necessary to store the mouse position to be able to restore it because of the nature of SendInput or mouse_event functions.expandcollapse popup#define _WIN32_WINNT 0x0501 #include <windows.h> VOID MouseMove(INT, INT); VOID MouseLeft(); VOID MouseRight(); INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd) { POINT pt; GetCursorPos(&pt); ShowCursor(FALSE); MouseMove(30, 30); MouseRight(); MouseMove(pt.x, pt.y); ShowCursor(TRUE); return 0; } VOID MouseMove(INT nX, INT nY) { INPUT input; DOUBLE fScreenWidth = GetSystemMetrics( SM_CXSCREEN )-1; DOUBLE fScreenHeight = GetSystemMetrics( SM_CYSCREEN )-1; DOUBLE fX = nX*(65535.0f/fScreenWidth); DOUBLE fY = nY*(65535.0f/fScreenHeight); RtlZeroMemory(&input, sizeof(input)); input.type = INPUT_MOUSE; input.mi.dwFlags = MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE; input.mi.dx = (LONG)fX; input.mi.dy = (LONG)fY; SendInput(1, &input, sizeof(input)); } VOID MouseLeft() { INPUT input; RtlZeroMemory(&input, sizeof(input)); input.type = INPUT_MOUSE; input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; SendInput(1, &input, sizeof(input)); RtlZeroMemory(&input, sizeof(input)); input.type = INPUT_MOUSE; input.mi.dwFlags = MOUSEEVENTF_LEFTUP; SendInput(1, &input, sizeof(input)); } VOID MouseRight() { INPUT input; RtlZeroMemory(&input, sizeof(input)); input.type = INPUT_MOUSE; input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN; SendInput(1, &input, sizeof(input)); RtlZeroMemory(&input, sizeof(input)); input.type = INPUT_MOUSE; input.mi.dwFlags = MOUSEEVENTF_RIGHTUP; SendInput(1, &input, sizeof(input)); }
wickss Posted April 9, 2009 Author Posted April 9, 2009 With the help of http://www.codeguru.com/forum/showthread.php?t=377394 great resource.It's still necessary to store the mouse position to be able to restore it because of the nature of SendInput or mouse_event functions.I don't know C++ so I don't know how to use this. If I figure out how to make a dll out of this, will it run fast enough so that the user can't see the flicker of moving the mouse?Autohotkeys can click without moving the mouse, but I can't use that in VB.net.
Authenticity Posted April 10, 2009 Posted April 10, 2009 Well, you can use right or left WM_LBUTTONDOWN and PostMessage. I don't know VB.NET but I guess that it's possible to use the previous code with lib importing. #include <windows.h> INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd) { POINT pt; pt.x = 30; pt.y = 30; HWND hWnd = WindowFromPoint(pt); LPARAM lParam = MAKELPARAM(30, 30); PostMessage(hWnd, WM_RBUTTONDOWN, MK_RBUTTON, lParam); PostMessage(hWnd, WM_RBUTTONUP, MK_RBUTTON, lParam); return 0; }
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now