首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetAsyncKeyState DLLImport语句

GetAsyncKeyState DLLImport语句
EN

Stack Overflow用户
提问于 2017-08-11 21:34:25
回答 1查看 1.3K关注 0票数 1

我遇到了一种情况,我需要根据操作系统更改我正在使用的DLL Import语句。我想知道是否有人注意到了这一点,知道为什么,或者是否有更好的方法来处理这一问题。

以下是显示该问题的最小代码片段。这是一个简单的命令行应用程序,只输出shift键的状态。

代码语言:javascript
复制
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系统上运行。

代码语言:javascript
复制
[DllImport("user32.dll", SetLastError = true)]
public static extern short GetAsyncKeyState(int virtualKeyCode);
EN

回答 1

Stack Overflow用户

发布于 2017-08-11 23:08:36

原来的声明是错误的。文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293.aspx

这将声明为:

代码语言:javascript
复制
SHORT WINAPI GetAsyncKeyState(
  _In_ int vKey
);

正确的p/invoke是:

代码语言:javascript
复制
[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int vKey);

请注意,我已经删除了SetLastError的设置。文档中没有提到调用SetLastError

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45636561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档