参照论坛大神的代码,编写了一个类,自己解决 用了EnumWindows和EnumChildWindows,请问为什么FindWindows和FindWindowsEx实现不了using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Forms; using System.Runtime.InteropServices; namespace 发送消息 { class FindWindows { //API函数调用 [DllImport("user32.dll")] public static extern int EnumWindows(EnumWindowsProc ewp, int lParam); [DllImport("user32.dll")] public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount); [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll")] public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct STRINGBUFFER { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)] public string szText; }
//成员变量,构造函数,属性 private IntPtr m_MainhWnd; private IntPtr m_ControlhWnd; private string m_ParentCaptin; private string m_ControlText; public FindWindows(string parentcaption) { m_ParentCaptin = parentcaption; } public IntPtr MainhWnd { get { return m_MainhWnd; } } //代理声明 public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param); //获取主窗体的句柄 public IntPtr GetMainFramHandle() { EnumWindowsProc EunmWindows = new EnumWindowsProc(EnumWindowsFun); EnumWindows(EunmWindows, 0);
我也是用这个方法,但FindWindowEx就是提示找不到子窗口
用了EnumWindows和EnumChildWindows,请问为什么FindWindows和FindWindowsEx实现不了using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace 发送消息
{
class FindWindows
{
//API函数调用
[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsProc ewp, int lParam); [DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount); [DllImport("user32.dll")]
public static extern bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct STRINGBUFFER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string szText;
}
//成员变量,构造函数,属性
private IntPtr m_MainhWnd;
private IntPtr m_ControlhWnd;
private string m_ParentCaptin;
private string m_ControlText; public FindWindows(string parentcaption)
{
m_ParentCaptin = parentcaption;
} public IntPtr MainhWnd
{
get
{
return m_MainhWnd;
}
} //代理声明
public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
//获取主窗体的句柄
public IntPtr GetMainFramHandle()
{ EnumWindowsProc EunmWindows = new EnumWindowsProc(EnumWindowsFun);
EnumWindows(EunmWindows, 0);
if (m_MainhWnd != IntPtr.Zero)
return m_MainhWnd;
else
return IntPtr.Zero;
}
//回调函数,枚举所有的主窗体,直至返回false
private bool EnumWindowsFun(IntPtr p_Handle, int p_Param)
{
if (!IsWindowVisible(p_Handle)) return true;
STRINGBUFFER _TitleString = new STRINGBUFFER();
GetWindowText(p_Handle, out _TitleString, 256);
if (_TitleString.szText == m_ParentCaptin)
{
m_MainhWnd = p_Handle;
return false;
}
return true;
} /// <summary>
/// 获取控件的句柄
/// </summary>
/// <param name="MainHandle">控件所在主窗口的句柄</param>
/// <param name="ControlText">控件上的文本</param>
/// <returns></returns>
///
public IntPtr GetControlHandle(IntPtr MainHandle,string ControlText)
{
m_ControlText = ControlText;
EnumWindowsProc EunmControl = new EnumWindowsProc(EnumControlFun);
EnumChildWindows(MainHandle, EunmControl, 0);
if (m_ControlhWnd != IntPtr.Zero)
return m_ControlhWnd;
else
return IntPtr.Zero;
}
private bool EnumControlFun(IntPtr p_Handle, int p_Param)
{
STRINGBUFFER _TextString = new STRINGBUFFER();
GetWindowText(p_Handle, out _TextString, 256); if (_TextString.szText == m_ControlText)
{
m_ControlhWnd = p_Handle;
return false;
}
return true;
} }
}
//调用 private void button1_Click(object sender, EventArgs e)
{
FindWindows fw = new FindWindows("Form2");
IntPtr MainhWnd = fw.GetMainFramHandle();
IntPtr BtnhWnd = fw.GetControlHandle(MainhWnd, "button1");
}