Je suis à la recherche d'un moyen de trouver le nom de l'imprimante Windows par défaut en utilisant C++ non géré (trouvé beaucoup d'exemples .NET, mais pas de succès non géré). Merci.Imprimante par défaut dans Unmanaged C++
Répondre
Les travaux suivants grands pour l'impression avec la win32api de C++
char szPrinterName[255];
unsigned long lPrinterNameLength;
GetDefaultPrinter(szPrinterName, &lPrinterNameLength);
HDC hPrinterDC;
hPrinterDC = CreateDC("WINSPOOL\0", szPrinterName, NULL, NULL);
À l'avenir au lieu de googler "win32/sujet /" "non géré" essayer googler ou "win32 api/sujet /"
GetDefaultPrinter (MSDN) devrait faire l'affaire. Cela vous donnera le nom à passer à CreateDC pour l'impression.
Voici comment obtenir une liste des imprimantes actuelles et celle par défaut s'il y en a un par défaut.
Notez également: obtenir zéro pour la longueur du nom d'imprimante par défaut est valide si l'utilisateur n'a pas d'imprimante ou n'en a pas défini par défaut. De même, si vous appelez GetDefaultPrinter avec NULL comme pointeur de mémoire tampon, la longueur du nom sera d'abord renvoyée, puis vous pourrez allouer un tampon de nom suffisamment grand pour contenir le nom.
DWORD numprinters;
DWORD defprinter=0;
DWORD dwSizeNeeded=0;
DWORD dwItem;
LPPRINTER_INFO_2 printerinfo = NULL;
// Get buffer size
EnumPrinters (PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS , NULL, 2, NULL, 0, &dwSizeNeeded, &numprinters);
// allocate memory
//printerinfo = (LPPRINTER_INFO_2)HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, dwSizeNeeded);
printerinfo = (LPPRINTER_INFO_2)new char[dwSizeNeeded];
if (EnumPrinters (PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, // what to enumerate
NULL, // printer name (NULL for all)
2, // level
(LPBYTE)printerinfo, // buffer
dwSizeNeeded, // size of buffer
&dwSizeNeeded, // returns size
&numprinters // return num. items
) == 0)
{
numprinters=0;
}
{
DWORD size=0;
// Get the size of the default printer name.
GetDefaultPrinter(NULL, &size);
if(size)
{
// Allocate a buffer large enough to hold the printer name.
TCHAR* buffer = new TCHAR[size];
// Get the printer name.
GetDefaultPrinter(buffer, &size);
for (dwItem = 0; dwItem < numprinters; dwItem++)
{
if(!strcmp(buffer,printerinfo[dwItem].pPrinterName))
defprinter=dwItem;
}
delete buffer;
}
}
Unmanaged C++ n'existe pas (et géré C++ est maintenant C++/CLI), si vous faites référence à C++, en utilisant non géré comme balise est juste triste ...
Code Unmanaged/C++ natif existe encore dans VS2008 et je crois en VS2010. Je ne suis pas sûr si les versions Express l'ont cependant. –
Comment récupérer et définir l'imprimante par défaut dans Windows:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;246772
parfois il n'y a aucune imprimante par défaut sélectionnée et dans ce cas, vous obtiendrez 0 pour printernamelength – KPexEA