消息处理模拟点击

Posted 相会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息处理模拟点击相关的知识,希望对你有一定的参考价值。

技术分享
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() + "!");

        }

    }

}
View Code

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

 

消息处理模拟点击

以上是关于消息处理模拟点击的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 中的 Android 片段模拟

模拟鼠标点击

SendMessage模拟点击按钮的问题

前端面试题之手写promise

微信小程序代码片段

pycharm添加Odoo代码片段