我枚举了当前机子的所有打印机,但我想改变其默认的打印机,如何用vc来实现呢?我研究了setprinter,一下这个函数,始终也没有找到一个方式,可以使用的,我又找到一个setdefaultprinter的函数,这个函数是不是仅仅对网络的打印机有效呢?请高手指教一下这个简单的问题,我已经研究了有一个星期了,但是没有成功!

解决方案 »

  1.   

    USES_CONVERSION;  BOOL bFlag;
      OSVERSIONINFO osv;
      DWORD dwNeeded = 0;
      HANDLE hPrinter = NULL;
      PRINTER_INFO_2 *ppi2 = NULL;
      LPTSTR pBuffer = NULL;
      LONG lResult;  osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
      GetVersionEx(&osv);
      
      if (!pPrinterName)
    return FALSE;    if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
      {
        bFlag = OpenPrinter(pPrinterName, &hPrinter, NULL);
        if (!bFlag || !hPrinter)
    return FALSE;   
        GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
        if (dwNeeded == 0)
        {
          ClosePrinter(hPrinter);
          return FALSE;
        }
        
        ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
        if (!ppi2)
        {
          ClosePrinter(hPrinter);
          return FALSE;
        }
        
        bFlag = GetPrinter(hPrinter, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded);
        if (!bFlag)
        {
          ClosePrinter(hPrinter);
          GlobalFree(ppi2);
          return FALSE;
        }
        
        ppi2->Attributes |= PRINTER_ATTRIBUTE_DEFAULT;
        bFlag = SetPrinter(hPrinter, 2, (LPBYTE)ppi2, 0);
        if (!bFlag)
        {
          ClosePrinter(hPrinter);
          GlobalFree(ppi2);
          return FALSE;
        }    lResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L,(LPARAM)(LPCTSTR)"windows", SMTO_NORMAL, 1000, NULL);
      }
      else if(osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
      {
        if (osv.dwMajorVersion >= 5) 
        {
          bFlag = SetDefaultPrinter(pPrinterName);
          if (!bFlag)
            return FALSE;
        }
        else 
        {
          bFlag = OpenPrinter(pPrinterName, &hPrinter, NULL);
          if(!bFlag || !hPrinter)
            return FALSE;
          
          GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
          if(dwNeeded == 0)
          {
            ClosePrinter(hPrinter);
            return FALSE;
          }
          ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
          if (!ppi2)
          {
            ClosePrinter(hPrinter);
            return FALSE;
          }
          bFlag = GetPrinter(hPrinter, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded);
          if ((!bFlag) || (!ppi2->pDriverName) || (!ppi2->pPortName))
          {
            ClosePrinter(hPrinter);
            GlobalFree(ppi2);
            return FALSE;
          }      pBuffer = (LPTSTR)GlobalAlloc(GPTR,lstrlen(pPrinterName) + lstrlen(ppi2->pDriverName) +lstrlen(ppi2->pPortName) + 3);
          if (!pBuffer)
          {
            ClosePrinter(hPrinter);
            GlobalFree(ppi2);
    return FALSE;
          }
          
          lstrcpy(pBuffer, pPrinterName);  lstrcat(pBuffer, ",");
          lstrcat(pBuffer, ppi2->pDriverName);  lstrcat(pBuffer, ",");
          lstrcat(pBuffer, ppi2->pPortName);
          
          bFlag = WriteProfileString("windows", "device", pBuffer);
          if (!bFlag)
          {
            ClosePrinter(hPrinter);
            GlobalFree(ppi2);
            GlobalFree(pBuffer);
    return FALSE;
          }
        }
        
        lResult = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L, 0L, SMTO_NORMAL, 1000, NULL);
      }
      
      if (hPrinter)
        ClosePrinter(hPrinter);
      if (ppi2)
        GlobalFree(ppi2);
      if (pBuffer)
        GlobalFree(pBuffer);
      

  2.   

    楼上的太狠了。从MSDN中直接代码拷过去不加一句解释;
    SetPrinter是用来修改指定打印机的数据的。
      

  3.   

    可以使用office类型库
    _Application objWord;
    objWord.SetActivePrinter(PrinterName);//PrinterName为你想设置为默认打印机的打印机名.
      

  4.   

    BOOL SetDefaultPrinter(
      LPCTSTR pszPrinter  // default printer name
    );
      

  5.   

    FROM msdn
    SetDefaultPrinterThe SetDefaultPrinter function sets the printer name of the default printer for the current user on the local computer.BOOL SetDefaultPrinter(
      LPCTSTR pszPrinter  // default printer name
    );ParameterspszPrinter
        [in] Pointer to a null-terminated string containing the default printer name. For a remote printer, the name format is \\server\printername. For a local printer, the name format is printername.    If this parameter is NULL or an empty string, that is, "", SetDefaultPrinter does nothing if there is already a default printer. However, if there is no default printer, SetDefaultPrinter sets the default printer to the first printer, if any, in an enumeration of printers installed on the local computer. Return ValuesIf the function succeeds, the return value is a nonzero value.If the function fails, the return value is zero. To get extended error information, call GetLastError.
    ResTo set the default printer on Windows 2000/XP, call SetDefaultPrinter. To set the default printer to earlier operating systems, call GetProfileString, WriteProfileString, and SendNotifyMessage, as shown in the following code:
      

  6.   

    http://community.csdn.net/Expert/topic/4240/4240389.xml?temp=.4703638