1. 程式人生 > >如何使用 SetPrinter 修改印表機設定

如何使用 SetPrinter 修改印表機設定

// MySetPrinter
// 
// Demonstrates how to use the SetPrinter API.  This particular function changes the orienation
// for the printer specified in pPrinterName to the orientation specified in dmOrientation.
// 
// Valid values for dmOrientation are:
// DMORIENT_PORTRAIT (1)
// or
// DMORIENT_LANDSCAPE (2)
BOOL MySetPrinter(LPTSTR pPrinterName, short dmOrientation)
{
	HANDLE hPrinter = NULL;
	DWORD dwNeeded = 0;
	PRINTER_INFO_2 *pi2 = NULL;
	DEVMODE *pDevMode = NULL;
	PRINTER_DEFAULTS pd;
	BOOL bFlag;
	LONG lFlag;

	// Open printer handle (on Windows NT, you need full-access because you
	// will eventually use SetPrinter)...
	ZeroMemory(&pd, sizeof(pd));
	pd.DesiredAccess = PRINTER_ALL_ACCESS;
	bFlag = OpenPrinter(pPrinterName, &hPrinter, &pd);
	if (!bFlag || (hPrinter == NULL))
		return FALSE;

	// The first GetPrinter tells you how big the buffer should be in 
	// order to hold all of PRINTER_INFO_2. Note that this should fail with 
	// ERROR_INSUFFICIENT_BUFFER.  If GetPrinter fails for any other reason 
	// or dwNeeded isn't set for some reason, then there is a problem...
	SetLastError(0);
	bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
         if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || 
         (dwNeeded == 0))
	{
		ClosePrinter(hPrinter);
		return FALSE;
	}

	// Allocate enough space for PRINTER_INFO_2...
	pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
	if (pi2 == NULL)
	{
		ClosePrinter(hPrinter);
		return FALSE;
	}

	// The second GetPrinter fills in all the current settings, so all you
	// need to do is modify what you're interested in...
	bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
	if (!bFlag)
	{
		GlobalFree(pi2);
		ClosePrinter(hPrinter);
		return FALSE;
	}

	// If GetPrinter didn't fill in the DEVMODE, try to get it by calling
	// DocumentProperties...
	if (pi2->pDevMode == NULL)
	{
		dwNeeded = DocumentProperties(NULL, hPrinter,
						pPrinterName,
						NULL, NULL, 0);
		if (dwNeeded <= 0)
		{
			GlobalFree(pi2);
			ClosePrinter(hPrinter);
			return FALSE;
		}

		pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
		if (pDevMode == NULL)
		{
			GlobalFree(pi2);
			ClosePrinter(hPrinter);
			return FALSE;
		}

		lFlag = DocumentProperties(NULL, hPrinter,
						pPrinterName,
						pDevMode, NULL,
						DM_OUT_BUFFER);
		if (lFlag != IDOK || pDevMode == NULL)
		{
			GlobalFree(pDevMode);
			GlobalFree(pi2);
			ClosePrinter(hPrinter);
			return FALSE;
		}

		pi2->pDevMode = pDevMode;
	}

	// Driver is reporting that it doesn't support this change...
	if (!(pi2->pDevMode->dmFields & DM_ORIENTATION))
	{
		GlobalFree(pi2);
		ClosePrinter(hPrinter);
		if (pDevMode)
			GlobalFree(pDevMode);
		return FALSE;
	}

	// Specify exactly what we are attempting to change...
	pi2->pDevMode->dmFields = DM_ORIENTATION;
	pi2->pDevMode->dmOrientation = dmOrientation;

	// Do not attempt to set security descriptor...
	pi2->pSecurityDescriptor = NULL;

	// Make sure the driver-dependent part of devmode is updated...
	lFlag = DocumentProperties(NULL, hPrinter,
		  pPrinterName,
		  pi2->pDevMode, pi2->pDevMode,
		  DM_IN_BUFFER | DM_OUT_BUFFER);
	if (lFlag != IDOK)
	{
		GlobalFree(pi2);
		ClosePrinter(hPrinter);
		if (pDevMode)
			GlobalFree(pDevMode);
		return FALSE;
	}

	// Update printer information...
	bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
	if (!bFlag)
	// The driver doesn't support, or it is unable to make the change...
	{
		GlobalFree(pi2);
		ClosePrinter(hPrinter);
		if (pDevMode)
			GlobalFree(pDevMode);
		return FALSE;
	}

	// Tell other apps that there was a change...
	SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
			  (LPARAM)(LPCSTR)pPrinterName,
			  SMTO_NORMAL, 1000, NULL);

	// Clean up...
	if (pi2)
		GlobalFree(pi2);
	if (hPrinter)
		ClosePrinter(hPrinter);
	if (pDevMode)
		GlobalFree(pDevMode);

	return TRUE;
}

相關推薦

如何使用 SetPrinter 修改印表機設定

// MySetPrinter // // Demonstrates how to use the SetPrinter API. This particular function changes the orienation // for the printer specified in pPrint

列印過程中修改印表機設定orientation等

使用ResetDC & DEVMODE 特別注意: 1)Note that a call to ResetDC resets all device context attributes back to default values. 2)The s

如何修改使用 DocumentProperties() 函式的印表機設定

LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice) { HANDLE hPrinter; LPDEVMODE pDevMode; DWORD dwNeeded, dwRet; /* S

C++ 印表機設定

我在網上已不斷看到一些網友關於自定義紙張列印的問題,基本上還沒有較完美的解決方案,我在這裡提供一個WindowsNT/2000/XP下的解決辦法,供廣大同仁參考。Windows9x/Me下也有解決辦法,有興趣者可共同探討。  該方法的主要思想是在程式開始時新增自定義紙張並設為預設紙張,程式結束前刪除該自定義紙

dedecms 後臺修改系統設定,但是config.cache.inc.php檔案不能寫入

fopen居然返回false,既不是目錄或檔案許可權相關問題,也不是檔案路徑問題(相對路徑、絕對路徑)等,更不是開啟檔案的模式問題(r,w,a等)。網上搜了一會,說到返回false的原因無非都是上面三種情況之一,所以沒有找到答案。於是動手添加了PHP錯誤報告: //error handler functio

獲取印表機設定的紙張引數

PrintDialog BS = new PrintDialog(); int x = BS.PrinterSettings.DefaultPageSettings.PaperSize.Width;//印表機預設紙張大小

完美解決新版WebStorm讓人彆扭的修改偏好設定中Tab鍵的縮排無效的問題

完美解決新版WebStorm讓人彆扭的Tab鍵的縮排問題 以前WebStorm設定好code style中的Tab size 和indent後就會預設是這個設定的值,但是新版的WebStorm出現了一個怪現象,無論如何設定Tab size 和indent, tab的縮排永遠都是2個字

Android O Settings原始碼流程分析(資料載入之獲取及修改預設設定屬性值)

Android O Settings  靜態介面篇 介面渲染篇 資料載入篇之一級選單 資料載入篇之二級選單 資料載入篇之獲取及修改預設設定屬性值 搜尋欄篇 載入預設設定值及修改:(涉及SettingsProvider) 示例:(裝置自動亮

Win10和Win7共享印表機設定方法

Win10和Win7如何共享印表機呢?當局域網中同時存在Win10和Win7系統,同時區域網中只有某一臺計算機連線有印表機時,我們可以通過區域網印表機共享操作來實現印表機共享。下面就與大家分享一下區域網電腦共享印表機的具體設定方法。

Jsoup文件--修改資料(設定屬性值)

設定屬性值 問題 解析完文件,在將其儲存到硬碟或作為HTTP響應傳送之前想要更改其中一些屬性值。 解決方案 使用設定屬性的方法Element.attr(String key, String value),Elements.attr(String key, St

Jsoup文件--修改資料(設定元素包含的HTML)

設定元素包含的HTML 問題 需要修改一個元素的HTML內容。 解決方案 使用Element中HTML setter方法。 Element div = doc.select("div").first(); // <div></div> d

python3+selenium實現126郵箱登陸 _修改個人設定(未封裝)

基於火狐瀏覽器實現126郵箱登陸並修改個人設定 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support impor

springboot 修改設定 banner

springboot 修改和設定 banner  先上圖   修改步驟 1.在src/main/resources下新建一個banner.txt文件 2.通過http://patorjk.com/software/taag網站生成需要的字元,將字元拷貝到步驟1所建立的

修改apache設定,支援UTF8和GBK

原本將apache預設設定成強制GBK編碼解釋網站,使得後來安裝UTF8的網站程式碼時出現亂碼的情況! 解決方法,修改/etc/httpd/conf/httpd.conf 檔案,將其中AddDefaultCharset行註釋掉(前面加#)。 儲存後重新啟動apache:/usr/sbin/apachectl

MYSQL-8.0.11 修改密碼 設定遠端連線

  本編文章是針對MYSQL-8.0.11安裝後root賬戶無法遠端登入,和修改賬戶密碼。環境為:CentOS 7.3 + Mysql8.0.11下載後執行:sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm1:安

jquery 表格的增加刪除和修改設定奇偶行顏色

最近一週在學了一點點HTML, CSS, javascript,用javascript的jquery完成了一個簡單的表格操作,有增加、刪除和修改功能。 表格分三列,第一列是學生編號(ID號),第二列是學生姓名,第三列為學生年齡。在姓名和年齡框內輸入資料,再點“Add”就可以增加資料(ID號會自動遞增

EBS 印表機設定——PASTA

按照Oracle的說法,PASTA解決的是通過CM直接列印到印表機的問題。換句話說如果不想通過CM直接列印到印表機,可以不使用PASTA;這個和PS中文輸出沒有關係。 確實如此,從執行過程看,我覺得完全可以這樣理解:PASTA是作業系統lp命令的擴充套件! PASTA的可

C#獲取本地印表機列表,並將指定印表機設定為預設印表機

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.W

修改tomcat設定訪問根目錄檔案

1.清除webapps\ROOT下的內容 2.修改conf下web.xml     <servlet>         <servlet-name>default</servlet-name>         <servlet-c

針式印表機設定字號大小

我的印表機是GP-76針式印表機,使用谷歌瀏覽器測試。 使用css設定列印字號程式碼: <styletype="text/css"> @mediaprint{ .chrome_adjust{ font-size:9px; -webkit-transform:s