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 开发 | Windows API - Win32
开发人员技术 | C#
开发人员技术 | C#

一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。

0 个注释 无注释

问题作者接受的答案

Tong Xu - MSFT 2,546 信誉分 Microsoft 外部员工
2024-07-03T05:02:18.7433333+00:00

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

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

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

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

此答案是否有帮助?

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

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。