asp.net 为什么只有在系统重新启动后才能正确检测默认打印机名称?

b1payxdu  于 2023-06-07  发布在  .NET
关注(0)|答案(1)|浏览(190)

我试图可靠地检测使用asp.net c#在Windows 11 pro计算机上使用Visual Studio 2022以调试模式运行网站时在计算机上设置的默认打印机。
我了解Windows可能会缓存打印机信息(包括默认打印机)以提高性能。在某些情况下,缓存的信息可能不反映对默认打印机所做的最新更改。重新启动系统可能会清除该高速缓存并强制Windows重新评估打印机配置。有什么办法可以防止这种情况吗?或者清除该高速缓存,这样就不需要重新启动了?
更改默认打印机似乎在windows操作系统界面中起作用,即。它用“默认”标签标记适当的打印机。
我正在尝试以下两种方法:

using System.Management;

ManagementObjectSearcher searcher = new 
                          ManagementObjectSearcher("SELECT * FROM Win32_Printer");
ManagementObjectCollection printerCollection = searcher.Get();

string defaultPrinterName = string.Empty;

foreach (ManagementObject printer in printerCollection)
{
    bool isDefault = (bool)printer["Default"];

    if (isDefault)
    {
        defaultPrinterName = printer["Name"].ToString();
    }
}

和/或

PrinterSettings printerSettings = new PrinterSettings();
string defaultPrinterName = printerSettings.PrinterName;

问题是,这两种方法在系统重新启动后都能正常工作,但是如果我更改系统上的默认打印机,然后运行上述代码,则系统重新启动时只显示默认打印机(而不是当前选择的默认打印机(在Windows打印机和设备屏幕中标记为默认))。
我还注意到,如果我安装了一台新打印机并将其设置为默认打印机,那么它将被检测为默认打印机,而无需重新启动系统。
在关闭的机会,我已经尝试重新启动打印后台程序服务和打印机扩展和通知服务,并尝试停止和启动应用程序池(在IIS中),我已经停止了Visual Studio 2022运行网站,并重建和重新运行它,但我唯一能找到的工作是系统重新启动!?!?!?
如何在每次更改默认打印机时都不重新启动的情况下检测默认打印机?

3ks5zfa0

3ks5zfa01#

好的,作为一般规则,如果您更改默认值,它只适用于您当前的桌面会话。
但是,您可以更改当前计算机的默认设置。
这似乎起作用:

<div style="padding:35px">

        <asp:ListBox ID="ListBox1" runat="server" Width="344px" Height="551px">

        </asp:ListBox>

        <br />
        <br />
        <asp:Button ID="cmdSetPtr" runat="server" Text="Set Default printer"
            OnClick="cmdSetPtr_Click"
            />

    </div>

后面的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadPrinters();
    }

    void LoadPrinters()
    {
        PrinterSettings OnePrinter = new PrinterSettings();
        foreach (string PrinterName in PrinterSettings.InstalledPrinters)
        {
            ListItem PtrItem = new ListItem(PrinterName);
            OnePrinter.PrinterName = PrinterName;
            if (OnePrinter.IsDefaultPrinter)
                PtrItem.Selected = true;

            ListBox1.Items.Add(PtrItem);               
        }
    }

    protected void cmdSetPtr_Click(object sender, EventArgs e)
    {
        string PrinterName = ListBox1.SelectedItem.Text;
        SetDefaultPrinter(PrinterName);
    }

    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool SetDefaultPrinter(string Name);

然后这个:

在上面,我改变了打印机,然后退出并从VS重新启动(f5),设置仍然存在。
如果我检查系统(打印机)-它也被改变了。
例如:

这是一个获取默认打印机的例程。

public string GetDefaultPrinter()
    {
        PrinterSettings OnePrinter = new PrinterSettings();
        foreach (string PrinterName in PrinterSettings.InstalledPrinters)
        {
            OnePrinter.PrinterName = PrinterName;
            if (OnePrinter.IsDefaultPrinter)
                return PrinterName;
        }
        return "";
    }

很确定你的例子是“通过设计”,你可以改变默认的打印机-但它只会在该程序运行期间持续存在,所以它不会影响其他程序。然而,我的这个“建议”和观点是在桌面软件的背景下。因此,您可以更改您的“当前”应用程序,它将保持选定状态,但在退出应用程序时,所有“操作系统”默认打印机都不会更改,也不是Word,以及所有其他程序的运行(因此通过设计)。
但是,上面发布的代码实际上更改了操作系统的默认打印机。

相关问题