【问题标题】:Cursor.Postition and Mouse_Event being BlockedCursor.Position 和 Mouse_Event 被阻止
【发布时间】:2014-07-18 05:07:50
【问题描述】:

我正在开发一个应用程序,以将一些输入自动化到另一个应用程序中。我遇到了一个问题。下面是我正在使用的功能代码

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

public enum MouseButton
{
    MOUSEEVENTF_LEFTDOWN = 0x02,
    MOUSEEVENTF_LEFTUP = 0x04,
    MOUSEEVENTF_RIGHTDOWN = 0x08,
    MOUSEEVENTF_RIGHTUP = 0x10
}

这是我用来移动和点击的代码

Point LocPoint = GetLocation(Column, Row, Item);
Console.WriteLine("Column: {0}\tRow: {1}\tItem: {2}\tPoints: {3}\tCursor: {4}", Column, Row, Item, Points, LocPoint.X + "," + LocPoint.Y);

Thread.Sleep(200);
Cursor.Position = LocPoint;
Thread.Sleep(10);

MouseClick.mouse_event((int)MouseButton.MOUSEEVENTF_LEFTDOWN | (int)MouseButton.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Thread.Sleep(200);

但是,当我没有要作为活动窗口输入的应用程序但说 mspaint 代码运行正常并且我从我想要单击的画笔中得到点时,事情变得有趣了我想在其中运行它的应用程序处于活动状态,鼠标永远不会移动,也没有注册点击,就好像应用程序正在拦截这些调用并忽略它们一样。所以这引出了两个问题

  1. 这可能吗?它如何检测鼠标和设置电源线之间的差异
  2. 有没有办法绕过这个或其他方法?

好的,所以每个人都告诉我改用 SendInput。好的,所以我将代码更改为使用 SendInput。我也尝试过 C# SendKeys 作为测试。目前我已经回到了基础,我只是想将字母 A 输入到我手动制作目标的文本输入框中。当我在记事本中运行它时,SendInput 和 SendKeys 都输入字母 A 但是当我在另一个应用程序中时,我试图自动执行此操作,但什么也没有显示。这是我正在使用的 SendInput 代码。

INPUT[] Inputs = new INPUT[2];
Inputs[0].type = WindowsAPI.INPUT_KEYBOARD;
Inputs[0].ki.wVk = 0;
Inputs[0].ki.dwFlags = WindowsAPI.KEYEVENTF_UNICODE;
Inputs[0].ki.wScan = 0x41;

Inputs[0].type = WindowsAPI.INPUT_KEYBOARD;
Inputs[0].ki.wVk = 0;
Inputs[1].ki.dwFlags = WindowsAPI.KEYEVENTF_KEYUP;
Inputs[0].ki.wScan = 0x41;

WindowsAPI.SendInput((uint)Inputs.Length, Inputs, Marshal.SizeOf(Inputs[0]));

【问题讨论】:

  • 你忘记了 MOUSEEVENTF_MOVE = 0x01; mouse_event() 很久以前就被弃用了。它有一个讨厌的问题,它不能告诉你你用错了。它没有 BOOL 返回值。因此,除了“它不起作用”之外,您永远无法确定您的代码中存在错误。请改用 SendInput()。从 pinvoke.net 之类的网站获取正确的声明,你的 mouse_event() 声明是错误的。
  • 用额外的测试更新了问题

标签: c# click cursor mouse


【解决方案1】:

因此,在沮丧之后,我决定在 Visual Studio 的调试模式之外运行该应用程序,结果却没有任何结果。然而,我决定以“管理员身份”运行应用程序,即使我已经关闭了 UAC,令我惊讶的是,应用程序正确地移动了鼠标、单击并输入了文本。我不知道为什么需要这样做,因为我以前使用过方法并且从来没有这样做过,但这似乎是解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 2015-10-09
    • 2018-07-29
    • 1970-01-01
    • 2012-07-25
    • 2020-03-14
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多