Πώς να ανακτήσετε και να ορίσετε τον προεπιλεγμένο εκτυπωτή στα Windows

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 246772 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ενημέρωση
Αυτό το άρθρο ισχύει για τα Windows 2000. Υποστήριξη για τα Windows 2000 λήγει στις 13 Ιουλίου 2010. Το Κέντρο λύσεων τέλος της υποστήριξης των Windows 2000 είναι ένα σημείο εκκίνησης για το σχεδιασμό σας στρατηγικής μετεγκατάστασης από τα Windows 2000. Για περισσότερες πληροφορίες, δείτε το Η πολιτική κύκλου ζωής υποστήριξης της Microsoft.
Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Να ανακτήσετε ή να ορίσετε τον προεπιλεγμένο εκτυπωτή χρησιμοποιώντας διαφορετικές μεθόδους, ανάλογα με την έκδοση των Windows που χρησιμοποιείτε.

Περισσότερες πληροφορίες

Με τα Windows NT 4.0 (και προηγούμενες εκδόσεις) που δεν είναι δυνατή Χρήση:
  • Είτε SetPrinter ή SetDefaultPrinter Για να ορίσετε τον προεπιλεγμένο εκτυπωτή.
  • Είτε EnumPrinters ή GetDefaultPrinter Για να λάβετε τον προεπιλεγμένο εκτυπωτή.
Με τα Windows NT 4.0, μπορείτε να Χρήση:
  • GetProfileString Για να λάβετε τον προεπιλεγμένο εκτυπωτή.
  • WriteProfileString Για να ορίσετε τον προεπιλεγμένο εκτυπωτή.
Η τιμή της ΣΥΣΚΕΥΉΣ που μπορείτε να λάβετε ή να ορίσετε περιέχει τρία στοιχεία που διαχωρίζονται με κόμματα, ως εξής:
      printer name,driver name,port
				
Για παράδειγμα:
      My Printer,HPPCL5MS,lpt1:
				
Σημειώστε τα ακόλουθα:
  • Όταν χρησιμοποιείτε αυτήν τη μέθοδο, πρέπει να καθορίσετε ένα έγκυρο εκτυπωτή, το πρόγραμμα οδήγησης και θύρα. Εάν δεν το κάνετε, θα τα API δεν Αποτυχία και μπορεί να προκαλέσει άλλα προγράμματα για να ρυθμίσετε τον εκτυπωτή Επιστροφή στην προηγούμενη έγκυρη εκτυπωτή ή γίνονται σύγχυση.

    Για να ανακτήσετε το όνομα εκτυπωτή, το όνομα του προγράμματος οδήγησης και το όνομα θύρας όλων των διαθέσιμων εκτυπωτών, χρησιμοποιήστε το EnumPrinters API.
  • Τα Windows NT χάρτες οι περισσότερες αναφορές αρχείου .ini στο μητρώο. Ως αποτέλεσμα, GetProfileString και WriteProfileString εξακολουθεί να λειτουργεί σαν να εκτελούνταν στην περιοχή 16-bit των Windows (Microsoft Windows και των Windows για ομάδες εργασίας).
  • Αφού ορίσετε τον προεπιλεγμένο εκτυπωτή με είτε GetPrinter, GetDefaultPrinter, ή WriteProfileString, ενημερώνει όλα τα άλλα ανοιχτά προγράμματα αλλαγής, μεταδίδοντας μήνυμα WM_SETTINGCHANGE. Μόνο τα προγράμματα που χειρίζονται αυτό το μήνυμα αναγνωρίζουν την αλλαγή.

    WM_SETTINGCHANGE και WM_WININICHANGE είναι η ίδια. Χρησιμοποιήστε WM_SETTINGCHANGE προγραμμάτων Win32.

Δείγμα κώδικα

Το ακόλουθο δείγμα κώδικα δείχνει τον τρόπο ανάκτησης του (προεπιλογή εκτυπωτήDPGetDefaultPrinter) και να ορίσετε την προεπιλογή (εκτυπωτήDPSetDefaultPrinter).
// You are explicitly linking to GetDefaultPrinter because linking 
// implicitly on Windows 95/98 or NT4 results in a runtime error.
// This block specifies which text version you explicitly link to.
#ifdef UNICODE
  #define GETDEFAULTPRINTER "GetDefaultPrinterW"
#else
  #define GETDEFAULTPRINTER "GetDefaultPrinterA"
#endif

// Size of internal buffer used to hold "printername,drivername,portname"
// string. You may have to increase this for huge strings.
#define MAXBUFFERSIZE 250

/*----------------------------------------------------------------*/ 
/* DPGetDefaultPrinter                                            */ 
/*                                                                */ 
/* Parameters:                                                    */ 
/*   pPrinterName: Buffer alloc'd by caller to hold printer name. */ 
/*   pdwBufferSize: On input, ptr to size of pPrinterName.        */ 
/*          On output, min required size of pPrinterName.         */ 
/*                                                                */ 
/* NOTE: You must include enough space for the NULL terminator!   */ 
/*                                                                */ 
/* Returns: TRUE for success, FALSE for failure.                  */ 
/*----------------------------------------------------------------*/ 
BOOL DPGetDefaultPrinter(LPTSTR pPrinterName, LPDWORD pdwBufferSize)
{
  BOOL bFlag;
  OSVERSIONINFO osv;
  TCHAR cBuffer[MAXBUFFERSIZE];
  PRINTER_INFO_2 *ppi2 = NULL;
  DWORD dwNeeded = 0;
  DWORD dwReturned = 0;
  HMODULE hWinSpool = NULL;
  PROC fnGetDefaultPrinter = NULL;
  
  // What version of Windows are you running?
  osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&osv);
  
  // If Windows 95 or 98, use EnumPrinters.
  if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  {
    // The first EnumPrinters() tells you how big our buffer must
    // be to hold ALL of PRINTER_INFO_2. Note that this will
    // typically return FALSE. This only means that the buffer (the 4th
    // parameter) was not filled in. You do not want it filled in here.
    SetLastError(0);
    bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned);
    {
      if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))
        return FALSE;
    }
    
    // Allocate enough space for PRINTER_INFO_2.
    ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
    if (!ppi2)
      return FALSE;
    
    // The second EnumPrinters() will fill in all the current information.
    bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned);
    if (!bFlag)
    {
      GlobalFree(ppi2);
      return FALSE;
    }
    
    // If specified buffer is too small, set required size and fail.
    if ((DWORD)lstrlen(ppi2->pPrinterName) >= *pdwBufferSize)
    {
      *pdwBufferSize = (DWORD)lstrlen(ppi2->pPrinterName) + 1;
      GlobalFree(ppi2);
      return FALSE;
    }
    
    // Copy printer name into passed-in buffer.
    lstrcpy(pPrinterName, ppi2->pPrinterName);
    
    // Set buffer size parameter to minimum required buffer size.
    *pdwBufferSize = (DWORD)lstrlen(ppi2->pPrinterName) + 1;
  }
  
  // If Windows NT, use the GetDefaultPrinter API for Windows 2000,
  // or GetProfileString for version 4.0 and earlier.
  else if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
  {
    if (osv.dwMajorVersion >= 5) // Windows 2000 or later (use explicit call)
    {
      hWinSpool = LoadLibrary("winspool.drv");
      if (!hWinSpool)
        return FALSE;
      fnGetDefaultPrinter = GetProcAddress(hWinSpool, GETDEFAULTPRINTER);
      if (!fnGetDefaultPrinter)
      {
        FreeLibrary(hWinSpool);
        return FALSE;
      }

      bFlag = fnGetDefaultPrinter(pPrinterName, pdwBufferSize);
        FreeLibrary(hWinSpool);
      if (!bFlag)
        return FALSE;
    }
    
    else // NT4.0 or earlier
    {
      // Retrieve the default string from Win.ini (the registry).
      // String will be in form "printername,drivername,portname".
      if (GetProfileString("windows", "device", ",,,", cBuffer, MAXBUFFERSIZE) <= 0)
        return FALSE;
      
      // Printer name precedes first "," character.
      strtok(cBuffer, ",");
      
      // If specified buffer is too small, set required size and fail.
      if ((DWORD)lstrlen(cBuffer) >= *pdwBufferSize)
      {
        *pdwBufferSize = (DWORD)lstrlen(cBuffer) + 1;
        return FALSE;
      }
      
      // Copy printer name into passed-in buffer.
      lstrcpy(pPrinterName, cBuffer);
      
      // Set buffer size parameter to minimum required buffer size.
      *pdwBufferSize = (DWORD)lstrlen(cBuffer) + 1;
    }
  }
  
  // Clean up.
  if (ppi2)
    GlobalFree(ppi2);
  
  return TRUE;
}
#undef MAXBUFFERSIZE
#undef GETDEFAULTPRINTER


// You are explicitly linking to SetDefaultPrinter because implicitly
// linking on Windows 95/98 or NT4 results in a runtime error.
// This block specifies which text version you explicitly link to.
#ifdef UNICODE
  #define SETDEFAULTPRINTER "SetDefaultPrinterW"
#else
  #define SETDEFAULTPRINTER "SetDefaultPrinterA"
#endif

/*-----------------------------------------------------------------*/ 
/* DPSetDefaultPrinter                                             */ 
/*                                                                 */ 
/* Parameters:                                                     */ 
/*   pPrinterName: Valid name of existing printer to make default. */ 
/*                                                                 */ 
/* Returns: TRUE for success, FALSE for failure.                   */ 
/*-----------------------------------------------------------------*/ 
BOOL DPSetDefaultPrinter(LPTSTR pPrinterName)

{
  BOOL bFlag;
  OSVERSIONINFO osv;
  DWORD dwNeeded = 0;
  HANDLE hPrinter = NULL;
  PRINTER_INFO_2 *ppi2 = NULL;
  LPTSTR pBuffer = NULL;
  LONG lResult;
  HMODULE hWinSpool = NULL;
  PROC fnSetDefaultPrinter = NULL;
  
  // What version of Windows are you running?
  osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&osv);
  
  if (!pPrinterName)
    return FALSE;
  
  // If Windows 95 or 98, use SetPrinter.
  if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  {
    // Open this printer so you can get information about it.
    bFlag = OpenPrinter(pPrinterName, &hPrinter, NULL);
    if (!bFlag || !hPrinter)
      return FALSE;
    
    // The first GetPrinter() tells you how big our buffer must
    // be to hold ALL of PRINTER_INFO_2. Note that this will
    // typically return FALSE. This only means that the buffer (the 3rd
    // parameter) was not filled in. You do not want it filled in here.
    SetLastError(0);
    bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
    if (!bFlag)
    {
      if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))
      {
        ClosePrinter(hPrinter);
        return FALSE;
      }
    }
    
    // Allocate enough space for PRINTER_INFO_2.
    ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
    if (!ppi2)
    {
      ClosePrinter(hPrinter);
      return FALSE;
    }
    
    // The second GetPrinter() will fill in all the current information
    // so that all you have to do is modify what you are interested in.
    bFlag = GetPrinter(hPrinter, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded);
    if (!bFlag)
    {
      ClosePrinter(hPrinter);
      GlobalFree(ppi2);
      return FALSE;
    }
    
    // Set default printer attribute for this printer.
    ppi2->Attributes |= PRINTER_ATTRIBUTE_DEFAULT;
    bFlag = SetPrinter(hPrinter, 2, (LPBYTE)ppi2, 0);
    if (!bFlag)
    {
      ClosePrinter(hPrinter);
      GlobalFree(ppi2);
      return FALSE;
    }
    
    // Tell all open programs that this change occurred. 
    // Allow each program 1 second to handle this message.
    lResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L,
      (LPARAM)(LPCTSTR)"windows", SMTO_NORMAL, 1000, NULL);
  }
  
  // If Windows NT, use the SetDefaultPrinter API for Windows 2000,
  // or WriteProfileString for version 4.0 and earlier.
  else if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
  {
    if (osv.dwMajorVersion >= 5) // Windows 2000 or later (use explicit call)
    {
      hWinSpool = LoadLibrary("winspool.drv");
      if (!hWinSpool)
        return FALSE;
      fnSetDefaultPrinter = GetProcAddress(hWinSpool, SETDEFAULTPRINTER);
      if (!fnSetDefaultPrinter)
      {
        FreeLibrary(hWinSpool);
        return FALSE;
      }

      bFlag = fnSetDefaultPrinter(pPrinterName);
      FreeLibrary(hWinSpool);
      if (!bFlag)
        return FALSE;
    }

    else // NT4.0 or earlier
    {
      // Open this printer so you can get information about it.
      bFlag = OpenPrinter(pPrinterName, &hPrinter, NULL);
      if (!bFlag || !hPrinter)
        return FALSE;
      
      // The first GetPrinter() tells you how big our buffer must
      // be to hold ALL of PRINTER_INFO_2. Note that this will
      // typically return FALSE. This only means that the buffer (the 3rd
      // parameter) was not filled in. You do not want it filled in here.
      SetLastError(0);
      bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
      if (!bFlag)
      {
        if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))
        {
          ClosePrinter(hPrinter);
          return FALSE;
        }
      }
      
      // Allocate enough space for PRINTER_INFO_2.
      ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
      if (!ppi2)
      {
        ClosePrinter(hPrinter);
        return FALSE;
      }
      
      // The second GetPrinter() fills in all the current<BR/>
      // information.
      bFlag = GetPrinter(hPrinter, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded);
      if ((!bFlag) || (!ppi2->pDriverName) || (!ppi2->pPortName))
      {
        ClosePrinter(hPrinter);
        GlobalFree(ppi2);
        return FALSE;
      }
      
      // Allocate buffer big enough for concatenated string.
      // String will be in form "printername,drivername,portname".
      pBuffer = (LPTSTR)GlobalAlloc(GPTR,
        lstrlen(pPrinterName) +
        lstrlen(ppi2->pDriverName) +
        lstrlen(ppi2->pPortName) + 3);
      if (!pBuffer)
      {
        ClosePrinter(hPrinter);
        GlobalFree(ppi2);
        return FALSE;
      }
      
      // Build string in form "printername,drivername,portname".
      lstrcpy(pBuffer, pPrinterName);  lstrcat(pBuffer, ",");
      lstrcat(pBuffer, ppi2->pDriverName);  lstrcat(pBuffer, ",");
      lstrcat(pBuffer, ppi2->pPortName);
      
      // Set the default printer in Win.ini and registry.
      bFlag = WriteProfileString("windows", "device", pBuffer);
      if (!bFlag)
      {
        ClosePrinter(hPrinter);
        GlobalFree(ppi2);
        GlobalFree(pBuffer);
        return FALSE;
      }
    }
    
    // Tell all open programs that this change occurred. 
    // Allow each app 1 second to handle this message.
    lResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L, 0L,
      SMTO_NORMAL, 1000, NULL);
  }
  
  // Clean up.
  if (hPrinter)
    ClosePrinter(hPrinter);
  if (ppi2)
    GlobalFree(ppi2);
  if (pBuffer)
    GlobalFree(pBuffer);
  
  return TRUE;
}
#undef SETDEFAULTPRINTER
				
Εμφανίζεται ο κωδικός για να μην λειτουργούν σε ορισμένες περιπτώσεις:
  • Εάν αφήσετε του SendMessageTimeout κλήση, κανένα άλλο πρόγραμμα δεν αναγνωρίζει την αλλαγή μέχρι να γίνει επανεκκίνηση του προγράμματος.
  • Εάν ένα διαφορετικό πρόγραμμα 32-bit δεν χειρίζεται το μήνυμα WM_SETTINGCHANGE, το άλλο πρόγραμμα αναγνωρίζει ότι έχει αλλάξει τον προεπιλεγμένο εκτυπωτή. Πρέπει να τερματίσετε και να ξεκινήσετε πάλι το πρόγραμμα για να επιβάλετε να αναγνωρίζουν την αλλαγή.
  • Η ρύθμιση MaxBufferSize θα είναι πολύ μικρό για την ακόλουθη συμβολοσειρά:
    printername,portname,drivername
    					
  • Όταν χρησιμοποιείτε το WriteProfileString API από το δείγμα κώδικα (η οποία πρέπει να χρησιμοποιήσετε μόνο για Windows NT 4.0 και παλιότερες εκδόσεις), θυμηθείτε να ανακτηθεί το όνομα θύρας που διαβιβάζεται WriteProfileString χρησιμοποιώντας το API 32-bit GetPrinter.

    Παρόλο που αυτό το όνομα θύρας είναι έγκυρη, προγράμματα 16-bit δεν μπορεί να το διαβάσει και ενδέχεται να αντιμετωπίσετε προβλήματα. Εάν χρησιμοποιήσετε αυτήν τη μέθοδο με τα Windows NT (έκδοση 4.0 και προηγούμενες εκδόσεις) και προγράμματα 16-bit πρέπει να κατανοήσετε το νέο όνομα θύρας, πρέπει να χρησιμοποιήσετε το ψευδώνυμο 16-bit για το (όνομα θύραςNE0xόπου x είναι ένας αριθμός). Μπορείτε να εντοπίσετε την αντιστοίχιση μεταξύ των ονομάτων θύρα 32-bit και τα ψευδώνυμα 16-bit στο μητρώο.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
266767 ΔΙΑΔΙΚΑΣΙΕΣ: Εκτυπωτής σύνολο που είναι Default Printer συστήματος
140560 ΔΙΑΔΙΚΑΣΙΕΣ: Ορισμός προεπιλεγμένου εκτυπωτή μέσω προγραμματισμού στα Windows 95, Windows 98 ή Windows μου

Ιδιότητες

Αναγν. άρθρου: 246772 - Τελευταία αναθεώρηση: Κυριακή, 29 Μαΐου 2011 - Αναθεώρηση: 4.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Windows XP Professional
  • Microsoft Windows 2000 Server
Λέξεις-κλειδιά: 
kbdswgdi2003swept kbgdi kbhowto kbprint kbmt KB246772 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:246772

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com