3

错误似乎很常见,但这里是:

eCA1901 P/Invoke declarations should be portable    As it is declared in your code, parameter 'dwExtraInfo' of P/Invoke 'NativeMethods.mouse_event(int, int, int, int, int)' will be 4 bytes wide on 64-bit platforms. This is not correct, as the actual native declaration of this API indicates it should be 8 bytes wide on 64-bit platforms. Consult the MSDN Platform SDK documentation for help determining what data type should be used instead of 'int'

这是代码行:

[System.Runtime.InteropServices.DllImport("user32.dll")]
internal static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

现在我尝试更改为 Uint 或与 64 位兼容的东西,或者可以在两者上使用的东西(品脱或其他东西,不记得名字)。

但是,如果我从 Int 更改为 Uint 或其他什么,它会破坏此代码:

if (click == "Left")
{
    NativeMethods.mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, MousePosition.X, MousePosition.Y, MousePosition.X, MousePosition.Y);
}
if (click == "Right")
{
    NativeMethods.mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, MousePosition.X, MousePosition.Y, MousePosition.X, MousePosition.Y);
}
if (down == "Left"+"True")
{
    NativeMethods.mouse_event(MOUSEEVENTF_LEFTDOWN , MousePosition.X, MousePosition.Y, MousePosition.X, MousePosition.Y);
}
if (down == "Right"+"True")
{
    NativeMethods.mouse_event(MOUSEEVENTF_RIGHTDOWN, MousePosition.X, MousePosition.Y, MousePosition.X, MousePosition.Y);
}

正如它所说(不能从int转换......)如果我在那里的所有东西上使用(uint),它似乎“工作”,但我不认为这是一个非常理想的方法。

这是 MouseEvent 代码:

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

还尝试将它们更改为 Uint。

现在我为什么要谈论 Uint 是因为我读到我应该把它改成那样。我不知道 Uint 与 Int 相比是什么。

所以如果有更好的方法,或者我做错了,请告诉。

4

1 回答 1

3

原始声明:

VOID WINAPI mouse_event(
  _In_  DWORD dwFlags,
  _In_  DWORD dx,
  _In_  DWORD dy,
  _In_  DWORD dwData,
  _In_  ULONG_PTR dwExtraInfo
);

正确的 C# 声明(可能的选项之一):

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern void mouse_event(
    int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);

为什么最后一个参数声明为IntPtr

因为它在原始声明中是一个指针类型,在 64 位进程的情况下它将是 8 个字节。IntPtr32 位进程是 4 个字节,64 位进程是 8 个字节,这意味着如果你想编译你的程序集AnyCPU或者x64你的mouse_event代码保持不变。

如果您不想每次使用时都将最后一个参数强制转换为 (IntPtr) mouse_event,您可以提供一个重载来执行此操作:

static void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo)
{
    mouse_event(dwFlags, dx, dy, dwData, (IntPtr)dwExtraInfo);
}

dwData另外,我认为您没有为&dwExtraInfo参数提供有效值。确保您遵循文档:MSDN

于 2013-08-04T00:47:42.403 回答