4

我需要的

在不移动光标的情况下模拟消息(主要是鼠标,但也包括键盘)。消息转到焦点窗口(起初,我想要最小化窗口,但我没有找到如何做到这一点,所以我用SetForegroundWindow它来聚焦它)。

我发现了什么

这个问题上,我发现我需要使用 pInvoked from user32.dll。我还发现了一个小代码示例,但它没有用。

我也发现了这个类似的问题。这家伙使用mouse_event,但它已被弃用。此函数采用米奇中的 X 和 Y 坐标。我试图转换我的坐标(使用SendMessage),但我失败了。

伊坎哈兹举个例子?

当然。已notepad.exe打开,我需要右键单击位于 (1210, 460) 的按钮。

我试过的

根据我在这里找到的示例,我执行了以下代码:

IntPtr hWnd = (IntPtr)FindWindow("notepad.exe", null);
SetForegroundWindow(hWnd);

var screenPoint = this.PointToScreen(new Point(1210, 460));
var handle = WindowFromPoint(screenPoint);

if (handle != IntPtr.Zero)
{
    //Right Button Down
    SendMessage(handle, 0x0204, IntPtr.Zero, IntPtr.Zero);
    //Right Button Up
    SendMessage(handle, 0x0205, IntPtr.Zero, IntPtr.Zero);
}

我也尝试在 中使用我以前的句柄hWndSendMessage但效果不佳。您可以在这里找到完整的代码。

先感谢您。

4

3 回答 3

4

如果我正确理解,您想在应用程序中注入点击事件而无需移动鼠标,就像游戏机器人一样,所以用户看不到总和正在使用他的鼠标和键盘......

如果我是对的,那么看看这个链接的回复,它可能是你想要的......

它在 c++ 中,但我猜这不是什么大问题......

http://social.msdn.microsoft.com/Forums/en-SG/vcgeneral/thread/e0071733-286a-4b4d-b294-685f8a788fb8

于 2013-02-25T19:37:01.373 回答
3

这是我年轻时制作的一些鼠标和键盘处理程序,用于在游戏屏幕上找到颜色并单击||右键单击+选项:P

也许有些代码可能对你有帮助,即使它是法语的......

        using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Abyte0
    {
        public partial class ClavierVirtuel
        {
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string _ClassName, string _WindowName);

            [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
            private static extern int SetForegroundWindow(int hwnd);

            //int handle = FindWindow(null, "Facebook - Windows Internet Explorer");

            //Give focus to the screen with the wanted name
            public static void DonnerFocus(string pNomFenetre)


    {
            //Get the handle of the app you want to send keys to
            int handle = FindWindow(null, pNomFenetre);

            //Set it to the foreground
            SetForegroundWindow(handle);
        }

        //write the string
        public static void Ecrire(string pPhrase)
        {
            //Send the keys on over
            SendKeys.SendWait(pPhrase);
        }

        //write a string and press enter
        public static void ecrire_Enter(string pPhrase)
        {
            foreach (char lettre in pPhrase)
            {
                SendKeys.SendWait(lettre.ToString());
            }
            System.Threading.Thread.Sleep(10);
            SendKeys.SendWait("{ENTER}");
        }
    }
}

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;

namespace Abyte0
{
    static class MouseHandler
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool SetCursorPos(int X, int Y);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

        private const int MOUSEEVENTF_LEFTDOWN = 0x02;
        private const int MOUSEEVENTF_LEFTUP = 0x04;
        private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
        private const int MOUSEEVENTF_RIGHTUP = 0x10;


        public static void moveMouse(ref int currentx, ref int currenty, string whattodo, int pNombre)
        {
            switch (whattodo)
            {
                case "addX":
                    for (int i = 0; i < pNombre; i++)
                    {
                        currentx++;
                        SetCursorPos(currentx + Form1.m_Border_x, currenty + Form1.m_Border_y);
                    }
                    break;
                case "addY":
                    for (int i = 0; i < pNombre; i++)
                    {
                        currenty++;
                        SetCursorPos(currentx + Form1.m_Border_x, currenty + Form1.m_Border_y);
                    }
                    break;
                case "remX":
                    for (int i = 0; i < pNombre; i++)
                    {
                        currentx--;
                        SetCursorPos(currentx + Form1.m_Border_x, currenty + Form1.m_Border_y);
                    }
                    break;
                case "remY":
                    for (int i = 0; i < pNombre; i++)
                    {
                        currenty--;
                        SetCursorPos(currentx + Form1.m_Border_x, currenty + Form1.m_Border_y);
                    }
                    break;
                default:
                    break;
            }
        }
        #region Mouse Left, Right1, Right2 Clicks
        public static void DoMouseLeftClick(int nx, int ny)
        {
            Random objRandom = new Random();
            SetCursorPos(nx + Form1.m_Border_x, ny + Form1.m_Border_y);
            mouse_event(MOUSEEVENTF_LEFTDOWN, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
            Thread.Sleep(objRandom.Next(1, 332));
            mouse_event(MOUSEEVENTF_LEFTUP, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
           // Thread.Sleep(objRandom.Next(objRandom.Next(10, objRandom.Next(180, 600)), objRandom.Next(objRandom.Next(666, 4000), 5102)));
            Handler.getFocus();
        }

        public static void DoMouseLeftClick(int[] pTab)
        {
            int nx = pTab[0];
            int ny = pTab[1];
            Random objRandom = new Random();
            SetCursorPos(nx + Form1.m_Border_x, ny + Form1.m_Border_y);
            mouse_event(MOUSEEVENTF_LEFTDOWN, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
            Thread.Sleep(objRandom.Next(1, 332));
            mouse_event(MOUSEEVENTF_LEFTUP, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
          //  Thread.Sleep(objRandom.Next(objRandom.Next(10, objRandom.Next(180, 600)), objRandom.Next(objRandom.Next(666, 4000), 5102)));
            Handler.getFocus();
        }

        public static void DoMouseRightClickOp1(int nx, int ny)
        {
            Random objRandom = new Random();
            SetCursorPos(nx + Form1.m_Border_x, ny + Form1.m_Border_y);
            mouse_event(MOUSEEVENTF_RIGHTDOWN, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
            Thread.Sleep(objRandom.Next(6, 237));
            mouse_event(MOUSEEVENTF_RIGHTUP, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
            Handler.getFocus();
            Thread.Sleep(objRandom.Next(1, 332));
            moveMouse(ref nx, ref ny, "addY", 20);
            DoMouseLeftClick(nx, ny);
        }


        public static void DoMouseRightClickOp2(int nx, int ny)
        {
            Random objRandom = new Random();
            SetCursorPos(nx + Form1.m_Border_x, ny + Form1.m_Border_y);
            mouse_event(MOUSEEVENTF_RIGHTDOWN, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
            Thread.Sleep(objRandom.Next(6, 237));
            mouse_event(MOUSEEVENTF_RIGHTUP, nx + Form1.m_Border_x, ny + Form1.m_Border_y, 0, 0);
            Handler.getFocus();
            Thread.Sleep(objRandom.Next(1, 332));
            moveMouse(ref nx, ref ny, "addY", 25);
            DoMouseLeftClick(nx, ny);
        }
        #endregion


        public static void DoSimpleClickNoFocus(int x,int y)
        {
            Random objRandom = new Random();
            SetCursorPos(x,y);
            mouse_event(MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0);
            Thread.Sleep(objRandom.Next(7, 258));
            mouse_event(MOUSEEVENTF_LEFTUP, x,y, 0, 0);
        }

    }
}
于 2013-02-14T15:26:34.447 回答
3

Raymond Chen 专门为你写了一篇博文:你不能用 PostMessage 模拟键盘输入。我知道您需要鼠标,而不是键,并且您使用的是 Send 而不是 Post,但完全相同的问题也适用于您。阅读链接。幸运的是,它还包含解决方案:使用SendInput函数。

合成击键、鼠标动作和按钮点击。

于 2013-02-14T14:00:00.127 回答