2012-07-31 105 views
1

我希望能夠做的在C#以下是等效的:如何設置在C#中的打印機端口上指定的打印機

  • 進入「設備和打印機」
  • 右鍵單擊打印機
  • 轉到端口標籤
  • 選擇COM12:端口
  • 單擊確定

我設法爲指定的打印機獲得ManagementObject並嘗試撥打:

mObj.SetPropertyValue(「PortName」,「COM12:」);

在該打印機的ManagementObject上 - 從ManagementBaseObject繼承。

但是,這段代碼對打印機設置沒有任何作用。

我懷疑我需要在相應的庫上使用P/Invoke,但經過大量搜索後,我無法找到庫或有關如何從c#中執行此操作的教程。

任何幫助將不勝感激。

回答

3

找到在互聯網上的一個不起眼的部分答案:

public static void SetPrinterPort(string printerName, string portName) 
     { 
      var oManagementScope = new ManagementScope(ManagementPath.DefaultPath); 
      oManagementScope.Connect(); 

      SelectQuery oSelectQuery = new SelectQuery(); 
      oSelectQuery.QueryString = @"SELECT * FROM Win32_Printer 
      WHERE Name = '" + printerName.Replace("\\", "\\\\") + "'"; 

      ManagementObjectSearcher oObjectSearcher = 
       new ManagementObjectSearcher(oManagementScope, @oSelectQuery); 
      ManagementObjectCollection oObjectCollection = oObjectSearcher.Get(); 

      foreach (ManagementObject oItem in oObjectCollection) 
      { 
       oItem.Properties["PortName"].Value = portName; 
       oItem.Put(); 
      } 
     } 

我敢肯定,最後一部分是你需要的任何管理對象的屬性。這讓我瘋狂,我可以看到Win32 API說我想設置的屬性是可讀/寫的,但沒有任何地方似乎有設置它的代碼。

現在我們知道了! :-)

我希望這對某人有用。