类名:JuBingHelper.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace Upload4GW.Helper
{
public enum MouseEventFlags
{
Move = 0x0001, //移动鼠标
LeftDown = 0x0002,//模拟鼠标左键按下
LeftUp = 0x0004,//模拟鼠标左键抬起
RightDown = 0x0008,//鼠标右键按下
RightUp = 0x0010,//鼠标右键抬起
MiddleDown = 0x0020,//鼠标中键按下
MiddleUp = 0x0040,//中键抬起
Wheel = 0x0800,
Absolute = 0x8000//标示是否采用绝对坐标
}
class JuBingHelper
{ //使用方法
//控件函数.窗口拖动(this.button1,this);
//控件函数.控件拖动(this.button2);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
/// <summary>
/// //根据坐标点获取句柄
/// </summary>
/// <param name="p"></param>
/// <returns></returns>
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point p);
/// <summary>
/// //获取窗口标题
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lpString"></param>
/// <param name="nMaxCount"></param>
/// <returns></returns>
[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount);
/// <summary>
/// //获取句柄类名
/// </summary>
/// <param name="hwnd"></param>
/// <param name="s"></param>
/// <param name="nMaxCount"></param>
[DllImport("user32.dll")]
private static extern void GetClassName(IntPtr hwnd, StringBuilder s, int nMaxCount);
/// <summary>
/// //获取句柄父句柄
/// </summary>
/// <param name="hwnd"></param>
/// <returns></returns>
[DllImport("user32.dll")]
private static extern IntPtr GetParent(IntPtr hwnd);
/// <summary>
/// //设置父句柄
/// </summary>
/// <param name="hwnd"></param>
/// <param name="cwnd"></param>
/// <returns></returns>
[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hwnd, IntPtr cwnd);
/// <summary>
/// //获取句柄矩形位置信息
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lpRECT"></param>
/// <returns></returns>
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hwnd, ref RECT lpRECT); //获取句柄矩形位置信息
[DllImport("User32")]
public extern static void SetCursorPos(int x, int y);
[DllImport("User32")]
public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);
[StructLayout(LayoutKind.Sequential)]
public struct 句柄信息结构体
{
public Rectangle 位置;
public string 密文显示;
public string 类名;
public List<IntPtr> 父窗句柄;
public List<string> 父窗标题;
public List<string> 父窗类名;
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
public static 句柄信息结构体 获取句柄信息(IntPtr 句柄)
{
句柄信息结构体 xinxi = new 句柄信息结构体();
xinxi.父窗句柄 = new List<IntPtr>();
xinxi.父窗标题 = new List<string>();
xinxi.父窗类名 = new List<string>();
RECT weizhi = new RECT();
GetWindowRect(句柄, ref weizhi);
xinxi.位置.X = weizhi.Left;
xinxi.位置.Y = weizhi.Top;
xinxi.位置.Width = weizhi.Right - weizhi.Left;
xinxi.位置.Height = weizhi.Bottom - weizhi.Top;
StringBuilder s = new StringBuilder(512);
string ss = GetTextBoxInfo(句柄);
xinxi.密文显示 = ss.ToString();
GetClassName(句柄, s, s.Capacity);
xinxi.类名 = s.ToString();
IntPtr f1 = GetParent(句柄);
IntPtr h;
while (f1 != IntPtr.Zero)
{
xinxi.父窗句柄.Add(f1);
StringBuilder s1 = new StringBuilder(512);
GetWindowText(f1, s1, s1.Capacity);
xinxi.父窗标题.Add(s1.ToString());
GetClassName(f1, s1, s1.Capacity);
xinxi.父窗类名.Add(s1.ToString());
h = f1;
f1 = GetParent(h);
}
return xinxi;
}
/// <summary>
/// //寻找目标进程窗口
/// </summary>
/// <param name="lpClassName"></param>
/// <param name="lpWindowName">窗体名称</param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
/// <summary>
///hwndparent为0表示桌面为父,hwndchildafter为null表示从第一个开始,lpwindowname为null表示步匹配该项
/// </summary>
/// <param name="hwndParent"></param>
/// <param name="hwndChildAfter"></param>
/// <param name="lpClassName"></param>
/// <param name="lpWindowName"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
/// <summary>
/// 设置进程窗口到最前
/// </summary>
/// <param name="hWnd"></param>
/// <returns></returns>
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
//模拟键盘事件
[DllImport("USER32.DLL")]
public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);
public delegate bool CallBack(IntPtr hwnd, int lParam);
[DllImport("USER32.DLL")]
public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
//给CheckBox发送信息
[DllImport("USER32.DLL", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, UInt32 wMsg, int wParam, int lParam);
/// <summary>
/// 给Text发送信息
/// </summary>
/// <param name="hWnd"></param>
/// <param name="Msg"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("USER32.DLL", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, string lParam);
[DllImport("USER32.DLL")]
public static extern IntPtr GetWindow(IntPtr hWnd, int wCmd);
/// <summary>
/// 讲信息发送给句柄对应的空间中
/// </summary>
/// <param name="hWnd"></param>
/// <param name="Msg"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);
/// <summary>
/// 发送操作信息
/// </summary>
/// <param name="hwnd">索要操作空间的句柄</param>
/// <param name="Msg">操作类型</param>
/// <param name="wParam">索要操作空间的句柄</param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
public static extern int SendMessageA(IntPtr hwnd, int Msg, IntPtr wParam, int lParam);
/// <summary>
/// 设置空间焦点
/// </summary>
/// <param name="hWnd"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern IntPtr SetFocus(IntPtr hWnd);
/// <summary>
/// 获取 句柄对应控件的值
/// </summary>
/// <param name="hWnd32"></param>
/// <returns></returns>
public static string GetTextBoxInfo(IntPtr hWnd32)
{
const int WM_GETTEXT = 0x000D;
IntPtr wParam = new IntPtr(100);
StringBuilder ret = new StringBuilder(256);
SendMessage(hWnd32, WM_GETTEXT, wParam, ret);
return ret.ToString();
}
/// <summary>
/// 设置 句柄对应控件的值
/// </summary>
/// <param name="hWnd32">句柄的值</param>
/// <param name="result">索要传输的值</param>
/// <returns></returns>
public static bool SetTextBoxInfo(IntPtr hWnd32, string result)
{
if (hWnd32 == IntPtr.Zero)
{
return false;
}
const int WM_SETTEXT = 0x000C;
IntPtr wParam = new IntPtr(100);
StringBuilder ret = new StringBuilder(256);
SendMessage(hWnd32, WM_SETTEXT, IntPtr.Zero, result);
return true;
}
/// <summary>
/// //查找控件句柄
/// </summary>
/// <param name="parent"></param>
/// <param name="classname"></param>
/// <param name="text"></param>
/// <returns></returns>
public static IntPtr Findview(IntPtr parent, string classname, string text)
{
IntPtr hwndtemp = FindWindowEx(parent, IntPtr.Zero, classname, text);
if (hwndtemp == IntPtr.Zero)
{
List<IntPtr> allchild = Findallchild(parent);
for (int i = 0; i < allchild.Count; i++)
{
句柄信息结构体 ju = 获取句柄信息(allchild[i]);
if (ju.类名 == classname && ju.密文显示 == text)
{
return allchild[i];
}
}
}
return hwndtemp;
}
/// <summary>
/// 查找子内容
/// </summary>
/// <param name="parent"></param>
/// <returns></returns>
public static IntPtr Findview(IntPtr parent)
{
IntPtr hwndtemp = FindWindowEx(parent, IntPtr.Zero, null, null);
return hwndtemp;
}
/// <summary>
/// 查找一级子控件句柄
/// </summary>
/// <param name="parent"></param>
/// <returns></returns>
public static List<IntPtr> Findchild(IntPtr parent)
{
List<IntPtr> allchild = new List<IntPtr>();
IntPtr hwnd = FindWindowEx(parent, IntPtr.Zero, null, null);
while (hwnd != IntPtr.Zero)
{
allchild.Add(hwnd);
hwnd = FindWindowEx(parent, hwnd, null, null);
}
return allchild;
}
/// <summary>
/// //查找所有子控件-广度遍历
/// </summary>
/// <param name="parent"></param>
/// <returns></returns>
public static List<IntPtr> Findallchild(IntPtr parent)
{
List<IntPtr> allchild = new List<IntPtr>();
allchild.Add(parent); //第一个添加父句柄,最后再删除
for (int i = 0; i < allchild.Count; i++)
{
IntPtr patenttemp = allchild[i];
IntPtr hwnd = FindWindowEx(patenttemp, IntPtr.Zero, null, null);
while (hwnd != IntPtr.Zero)
{
allchild.Add(hwnd);
hwnd = FindWindowEx(patenttemp, hwnd, null, null);
}
}
allchild.RemoveAt(0);
return allchild;
}
/// <summary>
/// 查找窗口
/// </summary>
/// <param name="classname"></param>
/// <param name="windowname"></param>
/// <returns></returns>
public static IntPtr Findform(string classname, string windowname)
{
IntPtr hwnd = FindWindow(classname, windowname);
return hwnd;
}
/// <summary>
/// 模拟鼠标左键单击
/// </summary>
/// <param name="hwnd">传递所操作的句柄</param>
/// <returns></returns>
public static bool ClickControl(IntPtr hwnd)
{
if (hwnd == IntPtr.Zero)
{
return false;
}
SendMessageA(hwnd, 0x0201, hwnd, 0);
SendMessageA(hwnd, 0x0202, hwnd, 0);
return true;
}
public static void ButtonClick(String xPos, String yPos)
{
int x = Int32.Parse(xPos);
int y = Int32.Parse(yPos);
SetCursorPos(x, y);
mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), x, y, 0, IntPtr.Zero);
mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), x, y, 0, IntPtr.Zero);
}
/// <summary>
/// 根据窗体标题获取窗体内容
/// </summary>
/// <param name="captionName"></param>
/// <returns></returns>
public static String GetWindowContentByCaptionName(String captionName)
{
DateTime d1 = DateTime.Now;
try
{
IntPtr systemInfo = IntPtr.Zero;
while (systemInfo == IntPtr.Zero)
{
DateTime d2 = DateTime.Now;
TimeSpan timeDiff = d2 - d1;
if (timeDiff.Seconds > 3)
{
return "";
}
Thread.Sleep(10);
systemInfo = FindWindow(null, captionName);
}
List<IntPtr> ptrList = JuBingHelper.Findchild(systemInfo);
if (ptrList.Count == 3)
{
StringBuilder sb = new StringBuilder();
JuBingHelper.句柄信息结构体 jubingInfo = JuBingHelper.获取句柄信息(ptrList[2]);
return jubingInfo.密文显示;
}
}
catch { }
return "";
}
/// <summary>
///
/// </summary>
/// <param name="captionName"></param>
/// <param name="timeout">超时时间</param>
/// <returns></returns>
public static IntPtr GetWindowAddress(String captionName,int timeout)
{
DateTime d1 = DateTime.Now;
try
{
IntPtr systemInfo = IntPtr.Zero;
while (systemInfo == IntPtr.Zero)
{
DateTime d2 = DateTime.Now;
TimeSpan timeDiff = d2 - d1;
if (timeDiff.Seconds > timeout)
{
return IntPtr.Zero;
}
LogHelper.Info("find...:"+timeDiff.Seconds);
Thread.Sleep(10);
systemInfo = FindWindow(null, captionName);
}
return systemInfo;
}
catch { }
return IntPtr.Zero;
}
/// <summary>
/// 根据窗体标题获取窗体内容
/// </summary>
/// <param name="captionName"></param>
/// <returns></returns>
public static String GetWindowContentByAddress(IntPtr address)
{
DateTime d1 = DateTime.Now;
try
{
List<IntPtr> ptrList = JuBingHelper.Findchild(address);
LogHelper.Info("count:"+ptrList.Count);
if (ptrList.Count == 3)
{
StringBuilder sb = new StringBuilder();
JuBingHelper.句柄信息结构体 jubingInfo = JuBingHelper.获取句柄信息(ptrList[2]);
return jubingInfo.密文显示;
}
}
catch { }
return "";
}
/// <summary>
/// 根据窗体标题判断是否存在窗体
/// </summary>
/// <param name="captionName"></param>
/// <returns></returns>
public static Boolean IsExistWindow(String captionName)
{
DateTime d1 = DateTime.Now;
try
{
IntPtr systemInfo = IntPtr.Zero;
while (systemInfo == IntPtr.Zero)
{
DateTime d2 = DateTime.Now;
TimeSpan timeDiff = d2 - d1;
if (timeDiff.Seconds > 2)
{
return false;
}
Thread.Sleep(10);
systemInfo = FindWindow(null, captionName);
}
return true;
}
catch { }
return false;
}
public static void CloseWindowByAddress(IntPtr address)
{
SendMessage(address, 0x0010, IntPtr.Zero, null);
Thread.Sleep(PublicConfig.时间_点击事件等待);
}
/// <summary>
/// 是否存在Windows
/// </summary>
/// <param name="className"></param>
/// <param name="lpclassName"></param>
/// <returns></returns>
public static Boolean IsExistWindow(String className,String lpclassName)
{
DateTime d1 = DateTime.Now;
IntPtr gwMainForm = IntPtr.Zero;
while (gwMainForm == IntPtr.Zero)
{
DateTime d2 = DateTime.Now;
TimeSpan timeDiff = d2 - d1;
if (timeDiff.Seconds > 2)
{
return false;
}
Thread.Sleep(10);
gwMainForm = FindWindow(className, null);
}
IntPtr panel = FindWindowEx(gwMainForm, IntPtr.Zero, lpclassName, null);
return !(panel == IntPtr.Zero);
}
}
}