我一直在尝试从DNP rx1打印机获取打印机状态,但是当我打开打印机的纸盘时,打印机的状态不会改变。这是一个使用py32win库访问状态的示例,当托盘打开时,它总是返回status = 0事件。
device_name = win32print.GetDefaultPrinter()
handle = win32print.OpenPrinter(device_name)
# Get the default properties for the printer
properties = win32print.GetPrinter(handle, 2)
[当我尝试win32print.GetPrinter(handle, 6) # 6 = print_info_6
时,出现一些NotImplementedException。因此,我的猜测是打印机的固件尚未实现print_info_6。因此我无法从打印机获取状态
我也尝试过将Powershell与:
Get-Printer | Select Name, PrinterStatus
打开纸盒或发生卡纸时,状态也不会改变。
我有什么要注意的吗?我还能尝试获取打印机的状态吗?
[PRINTER_INFO_6
在具有OneNote打印机的Windows 10 1903上为我在C ++中工作。
PRINTER_INFO_6
我用于测试的C ++代码。
我在测试中发现的一些问题:
#pragma comment(lib, "Winspool")
int main()
{
DWORD bufSize;
WCHAR* buf = NULL;
HANDLE hPrinter = NULL;
PRINTER_INFO_6 info = {};
DWORD needed;
BOOL result = FALSE;
DWORD err;
// Get required buffer size
result = GetDefaultPrinter(NULL, &bufSize);
if(!result)
{
err = GetLastError();
if (ERROR_INSUFFICIENT_BUFFER != err)
{
std::cout << "GetDefaultPrinter failed with error: \n" << GetLastError();
return 0;
}
}
buf = (WCHAR*)calloc(bufSize, sizeof(WCHAR));
result = GetDefaultPrinter(buf, &bufSize);
if (!result)
{
std::cout << "GetDefaultPrinter failed with error: \n" << GetLastError();
return 0;
}
std::wcout << "Printer name: " << buf << "\n";
result = OpenPrinter(buf, &hPrinter, NULL);
if (!result)
{
std::cout << "OpenPrinter failed with error: \n" << GetLastError();
return 0;
}
result = GetPrinter(hPrinter, 6, (LPBYTE)&info, sizeof(PRINTER_INFO_6), &needed);
if (!result)
{
err = GetLastError();
if (ERROR_INSUFFICIENT_BUFFER != err)
{
std::cout << "GetPrinter failed with error: \n" << GetLastError();
return 0;
}
}
BYTE* statBuf = (BYTE*)calloc(needed, sizeof(BYTE));
result = GetPrinter(hPrinter, 6, statBuf, needed, &needed);
if (!result)
{
std::cout << "GetPrinter failed with error: \n" << GetLastError();
return 0;
}
std::cout << "Printer status (low 32bit): " << *((DWORD*)statBuf) << "\n";
statBuf += sizeof(DWORD);
std::cout << "Printer status (high 32bit): " << *((DWORD*)statBuf) << "\n";
getchar();
}
中定义为DWORD
(4个字节),但PRINTER_INFO_6
structure为此要求8个字节(PRINTER_INFO_6
)。因此,当您将GetPrinter
结构作为needed == 8
参数传递时,会出现ERROR_INSUFFICIENT_BUFFER
错误。PRINTER_INFO_6
,但没有在pPrinter
中提及PRINTER_INFO_6
(Unicode)和_PRINTER_INFO_6W
(ANSI)。