技术思绪摘录旅行
你是否也有被广告弹框困扰,一开机,右下角弹出十来个,屏幕正中间还弹出十来个,非常的烦,今天就利用所学,来尝试解决这个问题,你弹框,我就删了你,但是得提前知道你的位置,我才知道删谁。

1、首先我们需要创建一个窗体,然后将控件拖入:

image.png

2、就是事件,每个按钮的事件如下:

button1:获取弹框信息的按钮

     -MouseDown 鼠标按下事件

     -MouseUp       鼠标弹起事件

     -MouseMove   鼠标移动事件

button2:修改句柄标题的按钮

    -Click         单击事件

image.png

image.png

3、创建这些事件,并填入代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GetWin
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 获取鼠标位置
        /// </summary>
        /// <param name="lpPoint">The lp point.</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int GetCursorPos(ref Point lpPoint);  //获取鼠标坐标,该坐标是光标所在的屏幕坐标位置
        /// <summary>
        /// 根据位置获取窗体句柄
        /// </summary>
        /// <param name="xPoint">The x point.</param>
        /// <param name="yPoint">The y point.</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int WindowFromPoint(int xPoint, int yPoint);  //指定坐标处窗体句柄
        /// <summary>
        ///获取窗体标题
        /// </summary>
        /// <param name="hwnd">The HWND.</param>
        /// <param name="lpString">The lp string.</param>
        /// <param name="nMaxCount">The n maximum count.</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int GetWindowText(int hwnd, StringBuilder lpString, int nMaxCount);//获取窗体标题名称
        /// <summary>
        ///获取句柄类名
        /// </summary>
        /// <param name="hwnd">The HWND.</param>
        /// <param name="lpstring">The lpstring.</param>
        /// <param name="nMaxCount">The n maximum count.</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern int GetClassName(int hwnd, StringBuilder lpstring, int nMaxCount); //获取窗体类名称      
        /// <summary>
        ///修改句柄信息
        /// </summary>
        /// <param name="hwnd">The HWND.</param>
        /// <param name="wMsg">The w MSG.</param>
        /// <param name="wParam">The w parameter.</param>
        /// <param name="lParam">The l parameter.</param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(int hwnd, int wMsg, int wParam, string lParam);//这个SendMessage是个好东西,可以实现很多功能,在这里是显示更改窗体的标题。

        /// <summary>
        /// 获取PID
        /// </summary>
        /// <param name="handle">The handle.</param>
        /// <param name="processId">The process identifier.</param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int GetWindowThreadProcessId(IntPtr handle, out uint processId);

        /// <summary>
        /// windowapi 找到指定窗体的句柄函数
        /// </summary>
        /// <param name="lpClassName">窗体类名</param>
        /// <param name="lpWindowName">窗体标题名</param>
        /// <returns>返回窗体句柄(IntPtr)</returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);                           



        bool isMouseUp = false;//判断鼠标左右键是否被按下状态
        Point pi = new Point();//鼠标的坐标
        int hwnd;//窗体句柄


        /// <summary>
        ///修改标题
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void button2_Click(object sender, EventArgs e)
        {
            SendMessage(hwnd, 12, 0, textBox1.Text);//利用api操作窗体标题,标题为textBox1.Text里面的text。
        }

        /// <summary>
        ///按下鼠标左键,开始获取
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param>
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseUp = true;//鼠标左右键被按下
            Cursor = Cursors.Cross; //改变鼠标样式为十字架
        }

        /// <summary>
        ///左键弹起,不再获取
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param>
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseUp = false;//鼠标左右键被弹起
            Cursor = Cursors.Default;//改变鼠标样式为默认
        }

        /// <summary>
        ///鼠标移动 如果按下则开始获取
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="MouseEventArgs"/> instance containing the event data.</param>
        private void button1_MouseMove(object sender, MouseEventArgs e)
        {
            //当鼠标移动时发生
            if (isMouseUp)//左键是否被按下
            {
                GetCursorPos(ref pi); //获取鼠标坐标值
                label5.Text = "坐标:X=" + pi.X + "  |  Y=" + pi.Y; //label1显示鼠标坐标值的x值与y值

                hwnd = WindowFromPoint(pi.X, pi.Y);//获取坐标值下的窗体句柄
                label6.Text = "句柄:" + hwnd;//lable2显示句柄,貌似SPY++是十六进制的,这个是十进制的

                StringBuilder titlename = new StringBuilder(256);
                GetWindowText(hwnd, titlename, 256);//name得到窗体的标题
                label7.Text = "标题:" + titlename.ToString();//label3显示标题

                StringBuilder classname = new StringBuilder(256);
                GetClassName(hwnd, classname, 256);//name得到class的名称(这个我也不知道叫什么)
                label8.Text = "名称:" + classname.ToString();//显示class的名称

                IntPtr intp = FindWindow(classname.ToString(), titlename.ToString());
                label9.Text = "路径:" + GetProcessPath(intp);

                Color col = GetPixelColor(pi.X, pi.Y);
                string colstr = ColorTranslator.ToHtml(col);
                label10.ForeColor = col;
                label10.Text = "颜色:" + colstr;

            }
        }

        //声明获取屏幕指定坐标点的颜色  所需的画板 
        private static Bitmap cache = new Bitmap(1, 1);
        private static Graphics tempGraphics = Graphics.FromImage(cache);
        /// <summary>
        ///获取屏幕指定坐标点的颜色  
        /// </summary>
        /// <param name="x">The x.</param>
        /// <param name="y">The y.</param>
        /// <returns></returns>
        public Color GetPixelColor(int x, int y)
        {
            tempGraphics.CopyFromScreen(x, y, 0, 0, new Size(1, 1));
            return cache.GetPixel(0, 0);
        }

        /// <summary>
        /// 截图
        /// </summary>
        public void GetFromScreen()
        {
            Bitmap cache1 = new Bitmap(500, 500);
            Graphics tempGraphics1 = Graphics.FromImage(cache1);
            tempGraphics1.CopyFromScreen(500, 500, 0, 0, new Size(500, 500));
            cache1.Save("Screen.png", ImageFormat.Png);
        }

        /// <summary>
        ///根据句柄获取路径
        /// </summary>
        /// <param name="hwnd">The HWND.</param>
        /// <returns></returns>
        public static string GetProcessPath(IntPtr hwnd)
        {
            if ((int)hwnd == 0)
            {
                return "";
            }
            try
            {
                uint pid = 0;
                GetWindowThreadProcessId(hwnd, out pid);
                Process proc = Process.GetProcessById((int)pid);
                return proc.MainModule.FileName;
            }
            catch
            {
                return "";
            }
        }
    }
}

4、启动看效果

image.png

点击开始获取按钮,并按住鼠标左键,移动到弹框的title上,并松开左键,举个例子:

image.png

看到路径了吗,可以直接去这个位置,将这个软件删除就不会有弹框了。

然后我们来尝试修改这个弹框的标题:

image.png

哈哈,成功了,但是这个修复只是当前这次启动可以改,弹框重启之后,又会变回来,主要就是想表达的是,拿到句柄,我们就能操作他了。

CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

精选推荐

阅读排行

友情打赏

请打开您的微信,扫一扫