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

Posted 天道酬勤,商道酬信。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这是要逆天么,看我控制台程序玩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() + "!");
        }
    }
}

 

以上是关于这是要逆天么,看我控制台程序玩Microsoft XPS Document 打印的主要内容,如果未能解决你的问题,请参考以下文章

终结 Python 原生字典?这个库要逆天改命了

[每日App一]QQ主题要逆天!轻轻松松月入30万!

腾讯云要逆天,一个人也能开发复杂的网络游戏,深圳腾讯云沙龙发来的报到!

十二月最佳旅行地推荐,这12个地方颜值简直要逆天了

重磅出击!!春季小程序活动大作战,看我怎么玩??

非常实用的冷门APP合集,小众但却逆天好用!