gpt4 book ai didi

用于键盘布局和编译器警告的 C# P/Invoke

转载 作者:太空宇宙 更新时间:2023-11-03 14:15:55 25 4
gpt4 key购买 nike

我不习惯 P/Invoke,但我应该声明几个 WinAPI 函数来获取或设置键盘布局。我声明了如下函数:


[DllImport("user32.dll")]
private static extern long LoadKeyboardLayout(
string pwszKLID, // input locale identifier
uint Flags // input locale identifier options
);

[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(
StringBuilder pwszKLID //[out] string that receives the name of the locale identifier
);

但是当我编译它时(在 C# WPF 应用程序中)我收到了警告:

CA1901微软.可移植性正如您的代码中声明的那样,P/Invoke 的返回类型在 64 位平台上将是 4 个字节宽。这是不正确的,因为实际的原生声明此 API 指示它在 64 位平台上应为 8 字节宽。请参阅 MSDN Platform SDK 文档以帮助确定应该使用什么数据类型而不是“long”。

和(我想这不太重要,因为键盘布局名称只是数字):

CA2101微软.全局化为降低安全风险,通过将 DllImport.CharSet 设置为 CharSet.Unicode,或通过将参数显式编码(marshal)为 UnmanagedType.LPWStr,将参数“pwszKLID”编码(marshal)为 Unicode。如果您需要将此字符串编码为 ANSI 或系统相关,请明确指定 MarshalAs,并设置 BestFitMapping=false;为了增加安全性,还设置 ThrowOnUnmappableChar=true。

我尝试使用 IntPtr 作为第一个警告,但这并没有解决问题。谁能帮我指出这些声明的正确形式?谢谢!

最佳答案

您可以尝试使用以下声明:

[DllImport("user32.dll", CharSet=CharSet.Unicode)]
private static extern IntPtr LoadKeyboardLayout(
string pwszKLID, // input locale identifier
uint Flags // input locale identifier options
);

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
[return : MarshalAs(UnmanagedType.Bool)]
private static extern bool GetKeyboardLayoutName(
StringBuilder pwszKLID //[out] string that receives the name of the locale identifier
);

CharSet 规范将清除 CA2101。将两种方法的返回值调整为正确的返回类型,并在 GetKeyboardLayoutName 上为返回值添加 MarshalAs 将清除 CA1901。

关于用于键盘布局和编译器警告的 C# P/Invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6583869/

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