IE 浏览器阻止打印页面的方法

当缺少打印机SDK且需自动打印时,通过C#程序实现Windows标准打印机的默认设置,并使用用户32.dll动态链接库检测并模拟点击IE打印页面的‘打印’按钮,从而实现自动打印功能。程序还包含了开机自启动和托盘运行的实现。
摘要由CSDN通过智能技术生成

遇到问题:在做一个项目时由于打印机硬件提供商无法提供对应的SDK驱动文件,只能当作Windows标准打印机进行使用,在用户领取时我们需要进行打出小票的程序,现在没有办法进行屏蔽打印页面!

解决办法:

首先我们先内置好默认打印机

1、控制面板中删除无关的设备,只保留我们的打印机

2、使用C#程序屏蔽对应页面(注意使用.NET3.5版本,因为客户机器是Win7_64  IE8)

新建一个 WinForm项目 

  需要1个托盘控件及 右键菜单的控件,绑定一下事件:

 private void CheckWindows()
        {

            Thread myThread = new Thread(PrintViewConnect);
            myThread.Start();
        }
         

        // 循环检测窗口
        private void PrintViewConnect()
        {
            while (true)
            {
                CheckPrintView();
            }
        }
        /// <summary>
        /// 找到窗口
        /// </summary>
        /// <param name="lpClassName">窗口类名(例:Button)</param>
        /// <param name="lpWindowName">窗口标题</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 找到窗口
        /// </summary>
        /// <param name="hwndParent">父窗口句柄(如果为空,则为桌面窗口)</param>
        /// <param name="hwndChildAfter">子窗口句柄(从该子窗口之后查找)</param>
        /// <param name="lpszClass">窗口类名(例:Button</param>
        /// <param name="lpszWindow">窗口标题</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="hwnd">消息接受窗口句柄</param>
        /// <param name="wMsg">消息</param>
        /// <param name="wParam">指定附加的消息特定信息</param>
        /// <param name="lParam">指定附加的消息特定信息</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);

        //窗口发送给按钮控件的消息,让按钮执行点击操作,可以模拟按钮点击
        private const int BM_CLICK = 0xF5;




  private void CheckPrintView()
        {

            //获取IE浏览器弹出的打印页面
            IntPtr maindHwnd = FindWindow(null, "打印");

            //看看能不能获取到
            if (maindHwnd != IntPtr.Zero)
            {

                //如果获取到了查找 【打印】 按钮
                IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "打印(&P)");//按钮控件标题

                //检测能不能找到
                if (childHwnd != IntPtr.Zero)
                {
                    //如果找到了模拟点击
                    SendMessage(childHwnd, BM_CLICK, 0, 0);
                }
                else {
                    //debug的时候使用
                    //MessageBox.Show("父窗口已经找到,但未找到按钮");
                }
            }
            else
            {   //debug的时候使用
                //MessageBox.Show("全部未找到");
            }
        }

在程序入口调用一下:

 核心代码为:

--- 解决问题的方法至此结束了,下面是全部代码包含:屏蔽打印页面、开机自启、托盘运行-------------------------------------------------------(权当是垃圾筐备用,你要是直接复制不能用的话自行检查一下)----------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace SocketServerToolc
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AutoStart();
            //窗体最小化显示
            this.WindowState = FormWindowState.Minimized;
            CheckWindows();
        }


        /// <summary>
        /// 不再显示窗体
        /// </summary>
        /// <param name="value"></param>
        protected override void SetVisibleCore(bool value)
        {
            base.SetVisibleCore(false);
        }



        /// <summary>
        /// 让程序不显示在alt+Tab视图窗体中
        /// </summary>
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_APPWINDOW = 0x40000;
                const int WS_EX_TOOLWINDOW = 0x80;
                CreateParams cp = base.CreateParams;
                cp.ExStyle &= (~WS_EX_APPWINDOW);    // 不显示在TaskBar
                cp.ExStyle |= WS_EX_TOOLWINDOW;      // 不显示在Alt+Tab
                return cp;
            }
        }


        /// <summary>
        /// 设置开机自启动
        /// </summary>
        private void AutoStart()
        {
            try
            {
                string regPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
                string path = Application.ExecutablePath.ToLower(); //将当前程序起动路径  
                string name = System.IO.Path.GetFileName(path);  //获得应用程序名称  
                var regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath, true);
                if (regKey == null) regKey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(regPath);
                regKey.SetValue(name, path);
            }
            catch
            {
            }
        }

        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }





        private void CheckWindows()
        {

            Thread myThread = new Thread(PrintViewConnect);
            myThread.Start();
        }
         

        // 监听客户端是否连接  
        private void PrintViewConnect()
        {
            while (true)
            {
                CheckPrintView();
            }
        }
        /// <summary>
        /// 找到窗口
        /// </summary>
        /// <param name="lpClassName">窗口类名(例:Button)</param>
        /// <param name="lpWindowName">窗口标题</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 找到窗口
        /// </summary>
        /// <param name="hwndParent">父窗口句柄(如果为空,则为桌面窗口)</param>
        /// <param name="hwndChildAfter">子窗口句柄(从该子窗口之后查找)</param>
        /// <param name="lpszClass">窗口类名(例:Button</param>
        /// <param name="lpszWindow">窗口标题</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="hwnd">消息接受窗口句柄</param>
        /// <param name="wMsg">消息</param>
        /// <param name="wParam">指定附加的消息特定信息</param>
        /// <param name="lParam">指定附加的消息特定信息</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);

        //窗口发送给按钮控件的消息,让按钮执行点击操作,可以模拟按钮点击
        private const int BM_CLICK = 0xF5;





        private void CheckPrintView()
        {

            //获取IE浏览器弹出的打印页面
            IntPtr maindHwnd = FindWindow(null, "打印");

            //看看能不能获取到
            if (maindHwnd != IntPtr.Zero)
            {

                //如果获取到了查找 【打印】 按钮
                IntPtr childHwnd = FindWindowEx(maindHwnd, IntPtr.Zero, null, "打印(&P)");//按钮控件标题

                //检测能不能找到
                if (childHwnd != IntPtr.Zero)
                {
                    //如果找到了模拟点击
                    SendMessage(childHwnd, BM_CLICK, 0, 0);
                }
                else {
                    //debug的时候使用
                    //MessageBox.Show("父窗口已经找到,但未找到按钮");
                }
            }
            else
            {   //debug的时候使用
                //MessageBox.Show("全部未找到");
            }
        }

        private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
        {

        }
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值