找到webbrowser中的控件句柄发送消息-转
Win32ApiWrapper类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace projectfortab4
{
public class Win32ApiWrapper
{
public const int WM_KEYDOWN = 0x100;
public const int WM_KEYUP = 0x101;
public const int VK_CONTROL = 0x11;
public const int VK_F5 = 0x74;
public const int KEYEVENTF_KEYUP = 0x2;
public const int VK_MENU = 0x12;
public const int WM_SETTEXT = 0xC;
public const int WM_CLEAR = 0x303;
public const int BN_CLICKED = 0;
public const int WM_LBUTTONDOWN = 0x201;
public const int WM_LBUTTONUP = 0x202;
public const int WM_CLOSE = 0x10;
public const int WM_COMMAND = 0x111;
public const int WM_SYSKEYDOWN = 0x104;
public const int GW_HWNDNEXT = 2;
public const int WM_CLICK = 0x00F5;
private static Dictionary<string, byte> keycode = new Dictionary<string, byte>();
private delegate bool WNDENUMPROC(IntPtr hWnd, int lParam);
static Win32ApiWrapper()
{
keycode.Add("A", 65);
keycode.Add("B", 66);
keycode.Add("C", 67);
keycode.Add("D", 68);
keycode.Add("E", 69);
keycode.Add("F", 70);
keycode.Add("G", 71);
keycode.Add("H", 72);
keycode.Add("I", 73);
keycode.Add("J", 74);
keycode.Add("K", 75);
keycode.Add("L", 76);
keycode.Add("M", 77);
keycode.Add("N", 78);
keycode.Add("O", 79);
keycode.Add("P", 80);
keycode.Add("Q", 81);
keycode.Add("R", 82);
keycode.Add("S", 83);
keycode.Add("T", 84);
keycode.Add("U", 85);
keycode.Add("V", 86);
keycode.Add("W", 87);
keycode.Add("X", 88);
keycode.Add("Y", 89);
keycode.Add("Z", 90);
keycode.Add("0", 48);
keycode.Add("1", 49);
keycode.Add("2", 50);
keycode.Add("3", 51);
keycode.Add("4", 52);
keycode.Add("5", 53);
keycode.Add("6", 54);
keycode.Add("7", 55);
keycode.Add("8", 56);
keycode.Add("9", 57);
keycode.Add(".", 0x6E);
keycode.Add("LEFT", 0x25);
keycode.Add("UP", 0x26);
keycode.Add("RIGHT", 0x27);
keycode.Add("DOWN", 0x28);
keycode.Add("-", 0x6D);
}
[DllImport("Gdi32.dll")]
public extern static int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public extern static IntPtr GetWindow(IntPtr hWnd, int wCmd);
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
[DllImport("user32.dll ")]
public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string FrmText);
[DllImport("user32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
private static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
private static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);
[DllImport("user32.dll")]
private static extern int GetClassNameW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
private static extern bool EnumChildWindows(IntPtr hWndParent, WNDENUMPROC lpEnumFunc, int lParam);
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendTxtMessage(int hWnd,
// handle to destination window
int Msg, // message
int wParam, // first message parameter
char[] lParam // int lParam // second message parameter
);
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static public extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, uint flags);
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(IntPtr hWnd, int HWND_TOPMOST, int x, int y, int Width, int Height, uint flags);
[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "PostMessage")]
public static extern IntPtr PostMessage(IntPtr hwndParent, int hwndChildAfter, IntPtr wParam, string lpszWindow);
/// <summary>
/// 获取桌面所有的窗口
/// </summary>
/// <returns></returns>
public static WindowInfo[] GetAllDesktopWindows()
{
List<WindowInfo> wndList = new List<WindowInfo>();
EnumWindows(delegate(IntPtr hWnd, int lParam)
{
WindowInfo wnd = new WindowInfo();
StringBuilder sb = new StringBuilder(256);
wnd.hWnd = hWnd;
GetWindowTextW(hWnd, sb, sb.Capacity);
wnd.SzWindowName = sb.ToString();
GetClassNameW(hWnd, sb, sb.Capacity);
wnd.SzClassName = sb.ToString();
wndList.Add(wnd);
return true;
}, 0);
return wndList.ToArray();
}
public static List<WindowInfo> GetWindowByParentHwndAndClassName(IntPtr parentHwnd, string className)
{
List<WindowInfo> wndList = new List<WindowInfo>();
EnumChildWindows(parentHwnd, delegate(IntPtr hWnd, int lParam)
{
WindowInfo wnd = new WindowInfo();
StringBuilder sb = new StringBuilder(256);
wnd.hWnd = hWnd;
GetWindowTextW(hWnd, sb, sb.Capacity);
wnd.SzWindowName = sb.ToString();
GetClassNameW(hWnd, sb, sb.Capacity);
wnd.SzClassName = sb.ToString();
wndList.Add(wnd);
return true;
}, 0);
return wndList.Where(o => o.SzClassName == className).ToList();
}
public static List<WindowInfo> GetChildWindowsByParentHwnd(IntPtr parentHwnd)
{
List<WindowInfo> childWndList = new List<WindowInfo>();
EnumChildWindows(parentHwnd, delegate(IntPtr hWnd, int lParam)
{
WindowInfo wnd = new WindowInfo();
StringBuilder sb = new StringBuilder(256);
wnd.hWnd = hWnd;
GetWindowTextW(hWnd, sb, sb.Capacity);
wnd.SzWindowName = sb.ToString();
GetClassNameW(hWnd, sb, sb.Capacity);
wnd.SzClassName = sb.ToString();
childWndList.Add(wnd);
return true;
}, 0);
return childWndList;
}
}
public class WindowInfo
{
public IntPtr hWnd { get; set; }
public string SzWindowName { get; set; }
public string SzClassName { get; set; }
}
}
WinAPI 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
namespace projectfortab4
{
class WinAPI
{
#region WinodwsAPI
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string IpClassName, string IpWindowName);
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
[DllImport("User32.DLL")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
public static int IDM_VIEWSOURCE = 2139;
public static uint WM_COMMAND = 0x0111;
[DllImport("user32.dll", EntryPoint = "GetParent")]
public static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll", EntryPoint = "GetCursorPos")]
public static extern bool GetCursorPos(out Point pt);
[DllImport("user32.dll", EntryPoint = "WindowFromPoint", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr WindowFromPoint(Point pt);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowRect(IntPtr hwnd, ref Rectangle rc);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetClientRect(IntPtr hwnd, ref Rectangle rc);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern int ScreenToClient(IntPtr hWnd, ref Rectangle rect);
#endregion
#region 封装API方法
/// <summary>
/// 找到句柄
/// </summary>
/// <param name="IpClassName">类名</param>
/// <returns></returns>
public static IntPtr GetHandle(string IpClassName)
{
return FindWindow(IpClassName, null);
}
/// <summary>
/// 找到句柄
/// </summary>
/// <param name="p">坐标</param>
/// <returns></returns>
public static IntPtr GetHandle(Point p)
{
return WindowFromPoint(p);
}
//鼠标位置的坐标
public static Point GetCursorPosPoint()
{
Point p = new Point();
if (GetCursorPos(out p))
{
return p;
}
return default(Point);
}
/// <summary>
/// 子窗口句柄
/// </summary>
/// <param name="hwndParent">父窗口句柄</param>
/// <param name="hwndChildAfter">前一个同目录级同名窗口句柄</param>
/// <param name="lpszClass">类名</param>
/// <returns></returns>
public static IntPtr GetChildHandle(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass)
{
return FindWindowEx(hwndParent, hwndChildAfter, lpszClass, null);
}
/// <summary>
/// 全部子窗口句柄
/// </summary>
/// <param name="hwndParent">父窗口句柄</param>
/// <param name="className">类名</param>
/// <returns></returns>
public static List<IntPtr> GetChildHandles(IntPtr hwndParent, string className)
{
List<IntPtr> resultList = new List<IntPtr>();
for (IntPtr hwndClient = GetChildHandle(hwndParent, IntPtr.Zero, className); hwndClient != IntPtr.Zero; hwndClient = GetChildHandle(hwndParent, hwndClient, className))
{
resultList.Add(hwndClient);
}
return resultList;
}
/// <summary>
/// 给窗口发送内容
/// </summary>
/// <param name="hWnd">句柄</param>
/// <param name="lParam">要发送的内容</param>
public static void SetText(IntPtr hWnd, string lParam)
{
SendMessage(hWnd, WM_SETTEXT, IntPtr.Zero, lParam);
}
private const int WM_SETTEXT = 0x000C;
/// <summary>
/// 获得窗口内容或标题
/// </summary>
/// <param name="hWnd">句柄</param>
/// <returns></returns>
public static string GetText(IntPtr hWnd)
{
StringBuilder result = new StringBuilder(128);
GetWindowText(hWnd, result, result.Capacity);
return result.ToString();
}
/// <summary>
/// 找类名
/// </summary>
/// <param name="hWnd">句柄</param>
/// <returns></returns>
public static string GetClassName(IntPtr hWnd)
{
StringBuilder lpClassName = new StringBuilder(128);
if (GetClassName(hWnd, lpClassName, lpClassName.Capacity) == 0)
{
throw new Exception("not found IntPtr!");
}
return lpClassName.ToString();
}
/// <summary>
/// 窗口在屏幕位置
/// </summary>
/// <param name="hWnd">句柄</param>
/// <returns></returns>
public static Rectangle GetWindowRect(IntPtr hWnd)
{
Rectangle result = default(Rectangle);
GetWindowRect(hWnd, ref result);
return result;
}
/// <summary>
/// 窗口相对屏幕位置转换成父窗口位置
/// </summary>
/// <param name="hWnd"></param>
/// <param name="rect"></param>
/// <returns></returns>
public static Rectangle ScreenToClient(IntPtr hWnd, Rectangle rect)
{
Rectangle result = rect;
ScreenToClient(hWnd, ref result);
return result;
}
/// <summary>
/// 窗口大小
/// </summary>
/// <param name="hWnd"></param>
/// <returns></returns>
public static Rectangle GetClientRect(IntPtr hWnd)
{
Rectangle result = default(Rectangle);
GetClientRect(hWnd, ref result);
return result;
}
public static void GetInfo(IntPtr vHandle)
{
SendMessage(vHandle, WM_COMMAND, IDM_VIEWSOURCE, (int)vHandle);
}
#endregion
}
}
button 点击事件:
private void button1_Click(object sender, EventArgs e)
{
var termname = this.Text;
var win = Win32ApiWrapper.GetAllDesktopWindows().Where(o => o.SzWindowName == termname).FirstOrDefault();
if (win != null)
{
IntPtr vHandles = webBrowser1.Handle;
vHandles = WinAPI.GetChildHandle(vHandles, IntPtr.Zero, "Shell Embedding");
vHandles = WinAPI.GetChildHandle(vHandles, IntPtr.Zero, "Shell DocObject View");
vHandles = WinAPI.GetChildHandle(vHandles, IntPtr.Zero, "Internet Explorer_Server");
//这里输出在webBrowser1中获取的html源码
WinAPI.GetInfo(vHandles);
var passwordCtrl = Win32ApiWrapper.GetChildWindowsByParentHwnd(win.hWnd).Where(o => o.SzClassName == "Edit").FirstOrDefault();
if (passwordCtrl != null)
{
//获得焦点
IntPtr hwnd_top = IntPtr.Zero;
uint swp_NoMovie = 2;
uint swp_NOSIZE = 1;
uint swp_NOACTIVATE = 0x10;
uint swp_SHOWWINDOW = 0x40;
Win32ApiWrapper.SetWindowPos(passwordCtrl.hWnd, hwnd_top, 0, 0, 0, 0, swp_NoMovie | swp_NOSIZE | swp_NOACTIVATE | swp_SHOWWINDOW);
Win32ApiWrapper.PostMessage(passwordCtrl.hWnd, Win32ApiWrapper.WM_LBUTTONDOWN, IntPtr.Zero, "");
Win32ApiWrapper.PostMessage(passwordCtrl.hWnd, Win32ApiWrapper.WM_LBUTTONUP, IntPtr.Zero, "");
//写东西进去
//1种方法:
SendKeys.Send("{TAB}");
//2种方法
//EsaiSuperKeys.InputHelper.WinRingInput("As");
//3种方法
WinAPI.SetText(passwordCtrl.hWnd, "aaa");
//WinAPI.SetText(passwordCtrl.hWnd, "assdaa");
}
}
}
posted on 2015-04-26 23:26 DreamOnTheGo 阅读(687) 评论(0) 编辑 收藏 举报