我遇到了一种情况,我需要根据操作系统更改我正在使用的DLL Import语句。我想知道是否有人注意到了这一点,知道为什么,或者是否有更好的方法来处理这一问题。
以下是显示该问题的最小代码片段。这是一个简单的命令行应用程序,只输出shift键的状态。
using System;
using System.Runtime.InteropServices;
namespace Shift
{
class Program
{
[DllImport("user32.dll", SetLastError = true)]
public static extern short GetAsyncKeyState(ushort virtualKeyCode);
static void Main(string[] args)
{
Console.WriteLine("Shift is: " + GetAsyncKeyState(0x10));
}
}
}当我在Windows8.1 x64上运行,或者在Windows7 x64上运行32位版本时,上面的功能运行得很好。然而,当为x64编译时,它不能在Windows7系统上工作。在这种情况下,GetAsyncKeyState总是返回0。
如果我将DLLImport更改为以下代码,则在为x64编译时,它可以在Windows7系统上运行。
[DllImport("user32.dll", SetLastError = true)]
public static extern short GetAsyncKeyState(int virtualKeyCode);发布于 2017-08-11 23:08:36
原来的声明是错误的。文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293.aspx
这将声明为:
SHORT WINAPI GetAsyncKeyState(
_In_ int vKey
);正确的p/invoke是:
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int vKey);请注意,我已经删除了SetLastError的设置。文档中没有提到调用SetLastError。
https://stackoverflow.com/questions/45636561
复制相似问题