c# winform拖拽获取窗体或者其他控件句柄

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34280681/article/details/80612649

c#winform拖拽获取窗体句柄

今天使用SPY++ Findwindow功能的时候,在想这个拖拽获取控件的名字还有句柄是否自己可以实现,然后拿起了VS2010,开整!经过测试时可以的。
下面是源码,欢迎各位大哥大姐指导指导,共同进步。


功能

  1. 按下鼠标移动鼠标获取当前的鼠标坐标相对于屏幕(看好是屏幕不是窗体),是通过api实现的,大佬们有什么其他简单的方法吗?
  2. 获取当前鼠标坐标的窗体句柄或者控件的句柄!(也是通过api实现的,大佬有什么简单的方法吗!)
  3. 通过句柄修改了窗体的标题名(这个也是api实现的,大佬有什么好的方法吗!!不仅可以修改自己的窗体标题,桌面上的窗体都可以)

源码

主界面:这里写图片描述

全局部分

        [DllImport("user32.dll")]       
        public static extern int GetCursorPos(ref Point lpPoint);  //获取鼠标坐标,该坐标是光标所在的屏幕坐标位置
        [DllImport("user32.dll")]        
        public static extern int WindowFromPoint(int xPoint,int yPoint);  //指定坐标处窗体句柄
        [DllImport("user32.dll")]
        public static extern int GetWindowText(int hwnd, StringBuilder lpString, int nMaxCount);//获取窗体标题名称
        [DllImport("user32.dll")]      
        public static extern int GetClassName(int hwnd,StringBuilder lpstring,int nMaxCount); //获取窗体类名称      
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(int hwnd, int wMsg, int wParam, string lParam);//这个SendMessage是个好东西,可以实现很多功能,在这里是显示更改窗体的标题。
        //等有机会整理一下这个SendMessage

        //[http://www.360doc.com/content/09/0814/10/19147_4907488.shtml]看这个链接吧!我一般参考这个学习SendMessage
        bool isMouseUp = false;//判断鼠标左右键是否被按下状态
        Point pi = new Point();//鼠标的坐标,这个Point要引用using System.Drawing;比较懒就用这个吧。
        int hwnd;//窗体句柄
        StringBuilder name=new StringBuilder(256);//接受窗体标题和类名称

SPY++是通过点击拖拽这个 这里写图片描述按钮实现获取窗体的信息。我做的相对简单,只不过是在点击一个按钮时改变了鼠标的样式。所以首先在窗体上添加一个按钮button1(主界面上的button1,我已经标注出来了)。下面是与button
1有关的函数,分别为鼠标按下,鼠标弹起,鼠标移动。

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseUp = true;//鼠标左右键被按下
            Cursor = Cursors.Cross; //改变鼠标样式为十字架
        }

        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseUp = false;//鼠标左右键被弹起
            Cursor = Cursors.Default;//改变鼠标样式为默认
        }

        private void button1_MouseMove(object sender, MouseEventArgs e)
        {
            //当鼠标移动时发生
            if (isMouseUp)//左键是否被按下
            {
                GetCursorPos(ref pi); //获取鼠标坐标值
                label1.Text = "坐标:X=" + pi.X + "  |  Y=" + pi.Y; //label1显示鼠标坐标值的x值与y值
                hwnd = WindowFromPoint(pi.X, pi.Y);//获取坐标值下的窗体句柄
                label2.Text = "句柄:" + hwnd.ToString();//lable2显示句柄,貌似SPY++是十六进制的,这个是十进制的
                GetWindowText(hwnd, name,256);//name得到窗体的标题
                label3.Text ="标题:"+ name.ToString();//label3显示标题
                GetClassName(hwnd, name, 256);//name得到class的名称(这个我也不知道叫什么)
                label4.Text = "名称:" + name.ToString();//显示class的名称
            }
        }

接下来是点击“修改标题”按钮button2.

        private void button2_Click_1(object sender, EventArgs e)
        {
            SendMessage(hwnd, 12, 0, textBox1.Text);//利用api操作窗体标题,标题为textBox1.Text里面的text。
        }

这里写图片描述

这样你可以获取任意一个窗口,修改窗体标题,但是重新打开就变回去啦。
不是所有的窗体标题都能修改。




最后。

欢迎指点,我也不知道我写这个干啥,可能是因为无聊吧。哈哈哈哈哈哈哈
哪里又不懂的可以在下面评论,上班无聊都会看看!
第一次写这么教程,所以写的不是很好,希望你们可以多多指导
我把代码上传啦!下载地址

展开阅读全文

没有更多推荐了,返回首页