微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查是否有默认打印机Windows?

有没有一个API或registry键,我可以使用从应用程序(本机,Java或.Net)来检查当前login的用户是否configuration了认打印机?

更新:非常感谢迄今为止的答案! 根据知识库文章http://support.microsoft.com/kb/156212 ,registry项(读/写)仅logging到Windows 2000.是否有更新版本的本机访问Win API方法

列出并连接到蓝牙设备

如何获取已安装的第三方更新信息

使用SMTP作为IP地址发送邮件时,无法parsing远程名称

移动位置并更改外部程序的大小

C# – 捕获Windows应用程序输出

在.NET中,这个代码适用于我:

public static string DefaultPrinterName() { string functionReturnValue = null; System.Drawing.Printing.PrinterSettings oPS = new System.Drawing.Printing.PrinterSettings(); try { functionReturnValue = oPS.PrinterName; } catch (System.Exception ex) { functionReturnValue = ""; } finally { oPS = null; } return functionReturnValue; }

来自: http : //in.answers.yahoo.com/question/index?qid=20070920032312AAsSaPx

非托管打印后台处理程序API winspool.drv有一个函数。 您可以调用GetDefaultPrinter函数以返回认打印机的名称

这是非托管函数的P / Invoke签名:

[DllImport("winspool.drv",CharSet=CharSet.Auto,SetLastError=true)] private static extern bool GetDefaultPrinter( StringBuilder buffer,ref int bufferSize);

使用此功能可确定是否设置了认打印机:

public static bool IsDefaultPrinterassigned() { //initialise size at 0,used to determine size of the buffer int size = 0; //for first call provide a null StringBuilder and 0 size to determine buffer size //return value will be false,as the call actually fails internally setting the size to the size of the buffer GetDefaultPrinter(null,ref size); if (size != 0) { //default printer set return true; } return false; }

使用此函数返回认打印机名称,如果未设置认值,则返回空字符串:

public static string GetDefaultPrinterName() { //initialise size at 0,ref size); if (size == 0) { //no default printer set return ""; } StringBuilder printerNameStringBuilder = new StringBuilder(size); bool success = GetDefaultPrinter(printerNameStringBuilder,ref size); if (!success) { throw new Win32Exception(Marshal.GetLastWin32Error()); } return printerNameStringBuilder.ToString(); }

完整的代码在控制台应用程序中测试:

using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Text; namespace DefaultPrinter { class Program { static void Main(string[] args) { Console.WriteLine(IsDefaultPrinterassigned()); Console.WriteLine(GetDefaultPrinterName()); Console.ReadLine(); } [DllImport("winspool.drv",CharSet = CharSet.Auto,SetLastError = true)] private static extern bool GetDefaultPrinter( StringBuilder buffer,ref int bufferSize); public static bool IsDefaultPrinterassigned() { //initialise size at 0,used to determine size of the buffer int size = 0; //for first call provide a null StringBuilder to and 0 size to determine buffer size //return value will be false,ref size); if (size != 0) { //default printer set return true; } return false; } public static string GetDefaultPrinterName() { //initialise size at 0,ref size); if (!success) { throw new Win32Exception(Marshal.GetLastWin32Error()); } return printerNameStringBuilder.ToString(); } } }

一个Java API来获取认打印机:

PrintService defaultPrinter = PrintServiceLookup.lookupDefaultPrintService();

如果没有认的打印机或服务,则返回null 。 这可以用作测试。

老答案

这些信息可以在注册表中找到。 您无法使用普通Java访问注册表,但是存在针对此问题的JNDI解决方案。 所以基本上你必须测试,如果在注册表中存在某个键。 而且,作为奖励,如果你来到这么远,你甚至应该能够得到认打印机的名称:)

进一步阅读:

注册表中更改用户认打印机

jRegistryKey (作为一个例子,围绕着更多的解决方案)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐