You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从设备上下文句柄获取对应设备名称?

可行,可通过Windows原生API实现从HDC反向获取设备名称

你可以通过以下几种方式实现CreateDC的逆操作,从GetDeviceCaps拿到的HDC中提取对应的设备名称:

  • 使用GetDeviceName函数(最直接)
    这是Windows提供的专门用于从HDC获取设备名称的API,定义在winuser.h中,使用时需要链接user32.lib。示例代码:

    #include <windows.h>
    
    TCHAR szDeviceName[MAX_PATH] = {0};
    if (GetDeviceName(hdc, szDeviceName, MAX_PATH)) {
        // szDeviceName 即为当前HDC对应的设备名称
    }
    

    该函数对显示设备HDC和打印设备HDC均适用。

  • 通过DEVMODE结构获取详细设备信息
    若需要同时获取设备的其他参数(如分辨率、打印格式等),可以使用DocumentProperties函数导出DEVMODE结构,其中的dmDeviceName字段就是设备名称:

    DEVMODE dm = {0};
    dm.dmSize = sizeof(DEVMODE);
    // 导出设备的配置信息到DEVMODE
    if (DocumentProperties(NULL, hdc, NULL, &dm, NULL, DM_OUT_BUFFER)) {
        // dm.dmDeviceName 存储了设备名称
    }
    
  • 针对打印设备HDC的额外方法
    如果确认HDC对应打印设备,还可以通过GetPrinter函数获取更详细的打印机信息:

    HANDLE hPrinter = NULL;
    // 从HDC获取打印机句柄
    if (GetPrinter(hdc, &hPrinter, NULL)) {
        DWORD dwSize = 0;
        GetPrinter(hPrinter, 2, NULL, 0, &dwSize);
        PRINTER_INFO_2* pInfo = (PRINTER_INFO_2*)malloc(dwSize);
        if (pInfo && GetPrinter(hPrinter, 2, (LPBYTE)pInfo, dwSize, &dwSize)) {
            // pInfo->pPrinterName 即为打印机设备名称
            free(pInfo);
        }
        ClosePrinter(hPrinter);
    }
    

在使用MS Detours拦截GetDeviceCaps时,只需在拦截函数中拿到传入的HDC,调用上述任意一种方法即可获取设备名称,注意处理API调用的返回值,确保线程安全和资源的正确释放。

内容的提问来源于stack exchange,提问作者Harry Muscle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:07:07