如何从设备上下文句柄获取对应设备名称?
可行,可通过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
相关产品推荐
相关产品推荐

