CreateFile访问键盘设备无法返回正确的句柄

zz y 20 信誉分
2024-07-03T03:25:03.82+00:00

我希望使用CreateFile访问键盘设备,使用以下代码

IntPtr hKeyboard = CreateFile("\\Device\\KeyboardClass0", GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (hKeyboard == IntPtr.Zero || hKeyboard.ToInt32() == -1)
{
	Int32 err = Marshal.GetLastWin32Error();
	throw new Win32Exception(err);
}

但是返回的hKeyboard的地址是0xffffffffffffffff 并且抛出System.ComponentModel.Win32Exception:“The system cannot find the path specified.”的异常

于是使用以下方式

if (!DefineDosDevice(DDD_RAW_TARGET_PATH, "myKBD", "\\Device\\KeyboardClass0"))
{
Int32 err = Marshal.GetLastWin32Error();
throw new Win32Exception(err);
}
IntPtr hKeyboard = CreateFile("\\\\.\\myKBD", GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (hKeyboard == IntPtr.Zero || hKeyboard.ToInt32() == -1)
{
Int32 err = Marshal.GetLastWin32Error();
throw new Win32Exception(err);
}

成功获取到句柄。 为什么能行?我把DefineDosDevice理解为为设备添加友好名称,但实际作用似乎不是这样?

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
98 个问题
C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
176 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Tong Xu - MSFT 2,456 信誉分 Microsoft 供应商
    2024-07-03T05:02:18.7433333+00:00

    你好! zz y
    欢迎来到Microsoft Q&A!

    我想DefineDosDevice并不是使CreateFile成功的直接因素, 而在于你使用了 " \\.\ " 前缀,
    " \\.\ " 前缀将访问 Win32 设备命名空间,而不是 Win32 文件命名空间。 这是直接访问物理磁盘和卷的方式,而无需通过文件系统(如果 API 支持这种类型的访问)。
    详情请参考: Win32 设备命名空间

    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知

    1 个人认为此答案很有帮助。

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。