【问题标题】:C# Clicking on a certain point on the screenC#点击屏幕上的某个点
【发布时间】:2011-10-01 12:59:01
【问题描述】:

我正在尝试通过 c# 执行鼠标单击。我使用了 mouse_event 函数。

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
[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);

我尝试了两种方法:

将鼠标移动到该点并单击它:

Cursor.Position = new Point(100, 100);
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0);

将所需点击的 x、y 传递给函数:

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,100, 100, 0, 0);

不管怎样,我就是这个奇怪的错误:

托管调试助手“PInvokeStackImbalance”在“C:\Users\or\Documents\Visual Studio 2010\Projects\ProjectName\ProjectName\bin\Debug\ProjectName.vshost.exe”中检测到问题。 附加信息:对 PInvoke 函数 'ProjectName!ProjectName.MainForm::mouse_event' 的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

关于解决方案的任何想法?

【问题讨论】:

    标签: c# click mouseevent


    【解决方案1】:

    我建议您使用以下 p/invoke 签名

    private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
    private const uint MOUSEEVENTF_LEFTUP = 0x04;
    
    [DllImport("user32.dll")]
    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, IntPtr dwExtraInfo);
    

    请注意,虽然mouse_event 很方便,但它已被SendInput 取代。您可以在以下 URL 中找到 SendInput 和 Input 结构的合理 p/invoke 声明。 http://www.pinvoke.net/default.aspx/user32.SendInput

    【讨论】:

      【解决方案2】:

      您显然是从旧版 VB6 代码中获得此代码的。 long 在 .NET 和 C# 中是 64 位的,与 VB6 中的 32 位不同。

      从long切换到int,应该没问题。

      编辑:我有点快:dwExtraInfo 应该是 IntPtr 类型。

      【讨论】:

      • 尝试将其类型更改为 IntPtr 并将 long 更改为 int。 (通过 new IntPtr() 作为额外信息)。还是没有变化
      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多