gpt4 book ai didi

c# - P/Invoke - Int 4 字节,尝试更改为 UInt 但它会导致问题

转载 作者:行者123 更新时间:2023-11-30 16:16:42 25 4
gpt4 key购买 nike

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

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 位兼容的东西,或者可以在两者上使用的东西(Pint 或其他东西,不记得名字了)。

但是如果我从 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 有什么区别。

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

最佳答案

原始声明:

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 个字节。 IntPtr 对于 32 位进程是 4 个字节,对于 64 位进程是 8 个字节,这意味着如果您想将程序集编译为 AnyCPUx64 你的 mouse_event 代码保持不变。

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

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

此外,我认为您没有为 dwDatadwExtraInfo 参数提供有效值。确保您遵循文档:MSDN

关于c# - P/Invoke - Int 4 字节,尝试更改为 UInt 但它会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18038667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com