How do I move the mouse pointer?

In Win98 (using Microsoft C++) I want to move the sliders on another application by controlling the mouse pointer, like marco programs do.

For example:
  move to x=400, y=500, mouse buttons released
  press left mouse
  move to x=440, y=500, left mouse held down.

Ideally this should be by  API, but if that is not possible then C code would be acceptable.

Ideally I would like to use coordinates relative to a named window rather than absolute screen coordinates.

How do I do this?
 
LVL 5
PC_User321Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
ZoppoConnect With a Mentor Commented:
Hi PC_User321,

this code for example moves the slider 10 pixels to the right when mouse is on the slider button.

POINT pt;
GetCursorPos( &pt );
int xMax = GetSystemMetrics( SM_CXSCREEN );
int yMax = GetSystemMetrics( SM_CYSCREEN );
int x = pt.x + 10; // new x-position in pixels
int y = pt.y; // new y-position in pixels
x = x * 65536 / xMax; // x-position in mickeys
y = y * 65536 / yMax; // x-position in mickeys
      
mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0 );

to move the mouse cursor onto the slider button you can either use mouse_event or SetCursorPos. If you use mouse_event you'll have to calculate the mickeys as above.

hope that helps,

ZOPPO
0
 
WynCommented:
You'd use mouse_event()...
Pay attention to the measure size of it ...
You can use ScreenToClient() to convert ...
0
 
WynCommented:
And you'd also use SetCursoPos() to move the mouse ...
That's the info I can give to you...

Regards
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
PC_User321Author Commented:
Thanks for your reply.

I am new to Windows programming, so please bear with me.

I looked up mouse_event in MSDN, and it appears to only tell you what the human is doing to the mouse, rather than allowing you to control the mouse.  For example, from MSDN:

MOUSEEVENTF_LEFTDOWN
Specifies that the left button is down.

I don't see any parameters like
  MOVE_MOUSE  or SIMULATE_BUTTON_PRESS

If it is possible to do things like that could you explain a bit more.


SetCursorPos looks as if it could be useful, but MSDN says

If the new coordinates are not within the screen rectangle set by the most recent ClipCursor function, Windows CE automatically adjusts the coordinates so the cursor stays within the rectangle.
.... and ...
A window should move the cursor only when the cursor is in its client area.

This makes me think that I may have difficulty moving the mouse anywhere on the screen, like macro programs do.

Any thoughts on this?


Thanks.
0
 
PC_User321Author Commented:
Sorry Wyn, but you haven't responded to my comments so I will unlock this question and allow others to comment.
0
 
ShaunWildeCommented:
I am afraid Wyn is right - mouse_event is the function you want. It is the MS documentation that leaves a lot to be desired.

the dwFlags parameter is an [in] parameter and can therefore only be used to set data not retrieve it.

to move the mouse use the MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE and set the dx,dy values.

to do a mouse click you would have to send a MOUSEEVENTF_LEFTDOWN followed by a MOUSEEVENTF_LEFTUP
0
 
PC_User321Author Commented:
Thanks for your reply.

You are basically saying the same as Wyn, but with more description, which I like.

You set LEFTDOWN and LEFTUP active simultaneously.  Is that going to result in the right thing, that is
   Left down, then
   Move, then
   Left up, ready to be moved to the next place?

If so, then how would I specify
   Left up, then
   Move, then
   Left down?
(I just want to get an understanding of how it works.  MSDN is helpful there.)

Will SetCursorPos and mouse_event let me go anywhere on the screen?

Thanks.
0
 
PC_User321Author Commented:
My last comment was directed to Zoppo.

Shaun, I only saw your post after I sumbitted mine.  Thinking about it.
0
 
ShaunWildeCommented:
I only saw zoppos after submitting mine :)
0
 
PC_User321Author Commented:
!! Bad mistake !!
I left out the 'un' in "MSDN is UNhelpful there"  :)

Shaun, you seem to be saying that I send separate mouse_events for
  move with button down
and
  release button.

Makes sense.
0
 
ZoppoCommented:
Hi PC_User321,

Well, I've tested it here and it worked, but perhaps it would be better to split it to three calls like this:

mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x, y, 0, 0 );
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );

Both SetCursorPos and mouse_event use screen coordinates (mouse_event uses 'mickeys', SetCursorPos uses pixels) and can be used to go anywhere on screen (or better anywhere on screen or if cursor clip rectangle is set with ClipCursor() anywhere in this cursor clip rectangle)

ZOPPO
0
 
PC_User321Author Commented:
I will accept Zoppo's answer and post conolation prizes for Wyn and Shaun in the MFC section.

Thanks to you all.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.