我有一個應用程式,需要將 Excel 檔案列印到默認列印機以外的特定列印機。
在 VB.NET 中,我在網上找到了一個允許我執行此操作的函式。
xlApp.ActivePrinter = FindPrinter("PrinterName")
FindPrinter 函式的代碼是
Function FindPrinter(ByVal PrinterName As String) As String
Dim Arr As Object
Dim Device As Object
Dim Devices As Object
Dim Printer As String
Dim RegObj As Object
Dim RegValue As String
Const HKEY_CURRENT_USER = &H80000001
RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
RegObj.EnumValues(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr)
For Each Device In Devices
RegObj.getstringvalue(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue)
Printer = Device & " on " & Split(RegValue, ",")(1)
If InStr(1, Printer, PrinterName, vbTextCompare) > 0 Then
FindPrinter = Printer
Exit Function
End If
Next
End Function
在 C# 中,我有這樣的代碼
public string FindPrinter(string PrinterName)
{
string FindPrinterRet = default;
var Arr = default(object);
var Devices = default(object);
string Printer;
object RegObj;
var RegValue = default(string);
const int HKEY_CURRENT_USER = int.MinValue 0x00000001;
RegObj = Microsoft.VisualBasic.Interaction.GetObject(@"winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
RegObj.EnumValues(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr);
foreach (var Device in (IEnumerable)Devices)
{
RegObj.GetStringValue(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue);
Printer = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Device, " on "), Strings.Split(RegValue, ",")[1]));
if (Strings.InStr(1, Printer, PrinterName, Constants.vbTextCompare) > 0)
{
FindPrinterRet = Printer;
return FindPrinterRet;
}
}
return FindPrinterRet;
}
但是 foreach 回圈之前的行導致 .EnumValues 部分出現問題,因為 C# 不確定如何處理這個問題,與 for 回圈內的 RegObj.GetStringValue 相同。
據我所知,這些值只是 VB.NET 中 System.Object 類的一部分,但我找不到讓它們在 C# 中作業的方法。
感謝所有花時間幫助我解決這個問題的人。
確切的錯誤是“object”不包含“EnumValues”的定義,并且找不到接受“object”型別的第一個引數的可訪問擴展方法“EnumValues”。
uj5u.com熱心網友回復:
逐字翻譯更像是:
static string? FindPrinter(string PrinterName)
{
const int HKEY_CURRENT_USER = int.MinValue 0x00000001;
dynamic regObj = Interaction.GetObject(@"winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")!;
regObj!.EnumValues(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", out dynamic devices, out dynamic arr);
foreach (var device in devices)
{
regObj.GetStringValue(HKEY_CURRENT_USER, @"Software\Microsoft\Windows NT\CurrentVersion\Devices", device, out dynamic value);
var printer = $"{device} on {value.Split(',')[1]}";
if (printer.Contains(PrinterName, StringComparison.OrdinalIgnoreCase))
return printer;
}
return null;
}
這樣做有什么是你正在試圖做的,雖然,從更好的方法PrinterSettings.InstalledPrinters,將LocalPrintServer課,WMI。即使您堅持自己使用注冊表,也有比這樣使用 COM 更好的方法。
uj5u.com熱心網友回復:
無需使用 WMI 打開注冊表。
public string FindPrinter(string PrinterName) {
string subkey = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Devices";
var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(subkey);
var printers = key.GetValueNames();
foreach(var printer in printers)
{
if (printer == PrinterName) {
return key.GetValue(printer);
}
}
return null;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/331398.html
下一篇:測驗集合中是否存在數字的排列
