开发者

Send keyboard and mouse events to DirectX application in C#?

开发者 https://www.devze.com 2023-03-05 16:04 出处:网络
I need to send global keystrokes and mouse events to another application, which is coincidentally using using DirectX. (No controls/handles other than the window itself)

I need to send global keystrokes and mouse events to another application, which is coincidentally using using DirectX. (No controls/handles other than the window itself)

For example, I need to hold key X for 2 seconds and then release it...

I need to push Right Click down on coordinates x:600 and y:350, move the mouse 100 pixels down and then release the Right Click.

I also need to push 2 or 开发者_JAVA技巧more keys at once, like X and Y, and stop X after 2 seconds and Y after 2 more seconds.

So basically I would need full control of the input system...

It would also be ideal if I could control the application while maximized or in background. (optionally)

For the skeptics... The teacher made a DirectX application for drawing for our school. I am asked to make an application that draws samples on it, like a train or flower or something... I will be reading images and use the input to set the color and click on the canvas...


There are some possibilities. You may have a look at System.Windows.Forms.SendKeys and you can pInvoke some Win32 functions like SetForegroundWindow(), LockSetForegroundWindow() from gdi32.dll or from user32.dll SetCursorPos() and mouse_event to perform clicks:

Here a snippet for the Mouse events I used a while ago.

    /**
     * Mouse functions
     */
    [DllImport("user32.dll", ExactSpelling=true)]
    public static extern long mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 cButtons, Int32 dwExtraInfo);

    [DllImport("user32.dll", ExactSpelling=true)]
    public static extern void SetCursorPos(Int32 x, Int32 y); 

    public const Int32 MOUSEEVENTF_ABSOLUTE = 0x8000;
    public const Int32 MOUSEEVENTF_LEFTDOWN = 0x0002;
    public const Int32 MOUSEEVENTF_LEFTUP = 0x0004;
    public const Int32 MOUSEEVENTF_MIDDLEDOWN = 0x0020;
    public const Int32 MOUSEEVENTF_MIDDLEUP = 0x0040;
    public const Int32 MOUSEEVENTF_MOVE = 0x0001;
    public const Int32 MOUSEEVENTF_RIGHTDOWN = 0x0008;
    public const Int32 MOUSEEVENTF_RIGHTUP = 0x0010;

    public static void PerformLeftKlick(Int32 x, Int32 y)
    {
        SetCursorPos(x, y);
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }

Hope that pushes you in the right direction. A good resource is http://pinvoke.net/


If you want to use a library for C# that will make your work easier then read following link -

http://www.codeproject.com/Articles/117657/InputManager-library-Track-user-input-and-simulate

Other than .Net C# you can use other language alternative like in Java where, there is no confusion of direct x or normal input -

http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号