这是要逆天么,看我控制台程序玩Microsoft XPS Document 打印

主要是想试试Microsoft XPS Document 打印时怎样去掉那个“将打印输出另存为”对话框

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Printing;
using System.Runtime.InteropServices;

namespace ConsoleApplication4
{
    /// <summary>
    /// 控制台玩 Microsoft XPS Document 打印
    /// </summary>
    class Program
    {
        //Win32 Api定义
        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfeter, string lpszClass, string lpszWindow);
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, String lParam);
        [DllImport("user32.dll")]
        static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
        //Win32消息定义
        const uint WM_SETTEXT = 0x000c;
        const uint WM_IME_KEYDOWN = 0x0290;
        const uint WM_LBUTTONDOWN = 0x0201;
        const uint WM_LBUTTONUP = 0x0202;
        static void Main(string[] args)
        {
            PrintDocument pd = new PrintDocument();
            pd.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";
            pd.PrintController = new StandardPrintController();
            pd.BeginPrint += Pd_BeginPrint;
            pd.PrintPage += Pd_PrintPage;
            pd.EndPrint += Pd_EndPrint;
            Action printTask = () =>
            {
                System.Threading.Thread t = new System.Threading.Thread(() =>
                {
                    while (true)
                    {
                        IntPtr hWnd = FindWindow("#32770", "将打印输出另存为");
                        if (hWnd != IntPtr.Zero)
                        {
                            IntPtr hChild;
                            // 由于输入框被多个控件嵌套,因此需要一级一级的往控件内找到输入框
                            hChild = FindWindowEx(hWnd, IntPtr.Zero, "DUIViewWndClassName", String.Empty);
                            hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", String.Empty);
                            hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", String.Empty);
                            hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", String.Empty);
                            hChild = FindWindowEx(hChild, IntPtr.Zero, "Edit", String.Empty);
                            SendMessage(hChild, WM_SETTEXT, IntPtr.Zero, AppDomain.CurrentDomain.BaseDirectory + Guid.NewGuid().ToString().Replace("-", "") + ".xps");
                            System.Threading.Thread.Sleep(100);
                            // 找到对话框内的保存按钮
                            hChild = IntPtr.Zero;
                            hChild = FindWindowEx(hWnd, IntPtr.Zero, "Button", "保存(&S)");
                            // 向保存按钮发送2个消息,以模拟click消息,借此来按下保存按钮
                            PostMessage(hChild, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
                            PostMessage(hChild, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
                        }
                        System.Threading.Thread.Sleep(100);
                    }
                });
                t.Start();
                int index = 0;
                while (index < 10)
                {
                    pd.Print();
                    LocalPrintServer prtSrv = new LocalPrintServer();
                    PrintQueue queue = prtSrv.GetPrintQueue("Microsoft XPS Document Writer");
                    do
                    {
                        System.Threading.Thread.Sleep(1000);
                        queue.Refresh();
                    } while (queue.NumberOfJobs > 0);
                    Console.WriteLine(DateTime.Now +string.Format( "任务{0}打印完成。",index));
                    index++;
                }
            };
            printTask.BeginInvoke(null, null);
            Console.ReadLine();
        }

        private static void Pd_EndPrint(object sender, PrintEventArgs e)
        {
            Console.WriteLine(DateTime.Now + e.PrintAction.ToString()+"!");
        }

        private static void Pd_PrintPage(object sender, PrintPageEventArgs e)
        {
            var g = e.Graphics;
            g.DrawString("Just A Print Test." +
                        Environment.NewLine +
                        Guid.NewGuid().ToString().Replace("-", ""),new System.Drawing.Font("微软雅黑", 12F), new SolidBrush(Color.Black), new Point(2, 2));
        }

        private static void Pd_BeginPrint(object sender, PrintEventArgs e)
        {
            Console.WriteLine(DateTime.Now + e.PrintAction.ToString() + "!");
        }
    }
}

 

时间: 2024-10-29 01:01:25

这是要逆天么,看我控制台程序玩Microsoft XPS Document 打印的相关文章

类UNIX系统下的控制台初级玩法

首先强烈推荐下载一个虚拟机并安装Ubuntu,并购买<嗨翻C语言> 有时候看过一些程序的main函数带有参数,形如 int main(int argc,char argv[]) 当时并不能懂这后面的参数是干嘛的. 直到.... 1 #include<stdio.h> 2 3 int main(int argc,char *argv[]){ 4 if(argc>1){ 5 printf("%s\n",argv[1]); 6 } 7 return 0; 8 }

.net开发环境的认识,控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印 两种数据类型,整形类型转换

首先感谢向立凯老师带我走进.net这个很好的软件开发程序.通过两天的学习在这个领域的了解也多了很多,让大家先了解一下c#语言 c#是一种全新且简单.安全.快捷面向对象的程序设计语言.是专门为.net应用开发的语言..net的开发都基于一个统一的开发环境 Visual Studio.net.下面我们来看看怎么在Visual Studio.net.下创建以新的项目: 1.打开 2.新建一个项目 通过执行文件-新建-项目菜单命令,会弹出一个新建项目对话框.在这个对话框中选择开发语言为c#,选择框架版本

重温delphi之控制台程序:Hello World!

原文:重温delphi之控制台程序:Hello World! 这二天用c#开发ActiveX时,发现不管怎么弄,c#就是没办法生成ocx的纯正activeX控件,而且还要强迫用户安装巨大的.net framework(我只是想做一个简单截屏功能的activeX整合到silverlight聊天室中),于是想起了曾经用过一年的delphi,虽然时过境迁,现在早以是.net的天下,但是不可否认,delphi仍是win32原生程序最佳的开发工具之一. 关于Delphi的语法学习,可以参见这个chm文档,

你们信不信一句Console.WriteLine就能让你的控制台程序失去响应

好久没更新博客了,今天是扒衣见君节,难得闲下来就来说说一个最近有趣的发现吧. 首先废话不多说,直接上代码吧 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var bytes = new byte[4096]; 6 for (int i = 0; i < bytes.Length; i++) 7 { 8 bytes[i] = 7; 9 } 10 11 Console.WriteLine(Encoding.ASCII.GetS

C# 发送邮件整理,包括控制台程序、WPF、WebForm 及 ASP.NET MVC

发送邮件使用SMTP服务器,有两种方案,一种是使用IIS的SMTP功能:另一种是直接使用邮件供应商的SMTP,比如Gmail.Sina.QQ等,使用这些SMTP服务器必须得注册帐号,一般可以直接用邮箱及密码,但是有些邮箱必须开启POP3/SMTP服务才可以,比如QQ邮箱默认是关闭的,可以在“设置”->“账户”里面找到.我今天整理的都是用的第二种. 早期的.NET版本用的是 System.Web.Mail 类提供的功能来发邮件:2.0版本推出了 System.Net.Mail 类来代替 Syste

重定向子进程控制台程序的输入输出

重定向子进程控制台程序的输入输出 重定向所做的工作都在父进程,但需要子进程遵守下面的规则: 子进程程序在输出代码后,等待输入之前需要调用fflush(stdout)函数,这样把输出的内容放入缓冲区,父进程才能及时的读到输出数据. 不遵守以上规则就没办法实现有效的交互了,cmd.exe是遵守这个规则的典范,大部分控制台程序都不遵守这个规则.今天我试图给Google的V8 Javascript 的Shell搞一个GUI,方便我输入Javascript程序,就遇到了v8_shell不遵守这个的问题.好

C、C++控制台程序、Windows API程序、MFC程序理解与比较

在编程语言中,函数是一个很重要的概念,其身影无处不在.在面向过程的编程方式中,函数更是程序的基本构建模块,在面向对象的编程方式中,函数演变为类或对象的成员(当然也可以使用与类无关的函数).函数由函数头和函数体组成.函数头包括域属性(如external.static或类域).返回值类型.函数名.及参数.域属性包括其在多文件编程中的可见范围,是否是属于某一个类的成员?返回值类型是指函数返回的值的具体数据类型(可以理解为函数输出的一部分).函数名是函数保存在内存代码区的首地址,用于函数的调用及函数指针

使用批处理选择运行控制台程序(简易cui)

批处理可以用于启动一些控制台程序.昨天在github上找到一个有意思的项目OpenRA : 一个开源的红警游戏. 发现该游戏的启动程序(launch-game)是用批处理写的 就学习了下 *没有玩过批处理的小哥哥 可以看一下这篇文章 https://blog.csdn.net/qq_36838191/article/details/83046599 部分源码: :choosemod set /P mod=Select mod (ra, cnc, d2k, ts) or --exit: if /I

Windows控制台程序“选定模式”的问题

最近用Nodejs写了个代理程序,一直用的好好的,木有问题,今天突然发现不能用了,使用telnet去连代理的端口也能连通,可是服务就是不能正常使用,提示连接超时. 当时猜测是Nodejs的某个地方阻塞了,分析了下代码,怎么也想不明白不能有阻塞的地方啊. 又是各种倒腾,后来发现一个奇怪的问题,我把鼠标放到Nodejs的控制台上,默认进入了编辑模式,而且整个应用的标题变成了"选定 XXXX"这种形式,我想退出程序,需要按两次Ctrl+C,难道是这的问题? 又来有测试了下,果真还是这的问题,