c#winform拖拽获取窗体句柄
今天使用SPY++ Findwindow功能的时候,在想这个拖拽获取控件的名字还有句柄是否自己可以实现,然后拿起了VS2010,开整!经过测试时可以的。
下面是源码,欢迎各位大哥大姐指导指导,共同进步。
##功能
- 按下鼠标移动鼠标获取当前的鼠标坐标相对于屏幕(看好是屏幕不是窗体),是通过api实现的,大佬们有什么其他简单的方法吗?
- 获取当前鼠标坐标的窗体句柄或者控件的句柄!(也是通过api实现的,大佬有什么简单的方法吗!)
- 通过句柄修改了窗体的标题名(这个也是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。
}
这样你可以获取任意一个窗口,修改窗体标题,但是重新打开就变回去啦。
不是所有的窗体标题都能修改。
##最后。
欢迎指点,我也不知道我写这个干啥,可能是因为无聊吧。哈哈哈哈哈哈哈
哪里又不懂的可以在下面评论,上班无聊都会看看!
第一次写这么教程,所以写的不是很好,希望你们可以多多指导
我把代码上传啦!下载地址