请教:C#中如何获取其它窗口(比如记事本的字体设置窗口)中每一个控件的句柄以及设置ComboLBox的选中项? 本帖最后由 w59879213 于 2013-08-23 13:28:15 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 static class Program{ private static void Main() { var hNotePad = FindWindow("Notepad", null); if (hNotePad == IntPtr.Zero) throw new Exception("notepad 没有打开"); IntPtr hDialog = IntPtr.Zero; EnumWindows((hwnd, lParam) => { var owner = GetWindow(hwnd, GW_OWNER); if (owner == hNotePad) hDialog = hwnd; return true; }, IntPtr.Zero); if (hDialog == IntPtr.Zero) throw new Exception("请先打开字体对话框"); var sb = new StringBuilder(250); GetWindowText(hDialog, sb, 250); if (sb.ToString() != "字体") throw new Exception("打开的不是字体对话框"); var hCombobox = GetDlgItem(hDialog, 0x470); Console.WriteLine("--------- 对话框上的控件列表 --------"); EnumChildWindows(hDialog, (hChild, _) => { var id = GetDlgCtrlID(hChild); var sb2 = new StringBuilder(250); GetClassName(hChild, sb, 250); GetWindowText(hChild, sb2, 250); Console.WriteLine("0x{0:x} (id = 0x{1:x}) : {2} (\"{3}\")", hChild, id, sb, sb2); return true; }, IntPtr.Zero); var item = "华文中宋"; var index = SendMessage(hCombobox, CB_FINDSTRING, 0, item); Console.WriteLine("选取'{0}', index={1}", item, index); SendMessage(hCombobox, CB_SELECTSTRING, 0, item); } public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam); [DllImport("user32.dll")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] private static extern IntPtr GetWindow(IntPtr hWnd, int uCmd); [DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")] private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); [DllImport("user32.dll")] private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")] private static extern int GetDlgCtrlID(IntPtr hwndCtl); [DllImport("user32.dll")] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll")] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, int wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, int wParam, string lParam); private const int GW_OWNER = 4; private const int CB_FINDSTRING = 0x014C; private const int CB_SELECTSTRING = 0x014D; private const int CB_SETCURSEL = 0x014E;} C#如何在已有的一个Excel文件中增加新的Sheet? combobox绑定对象后无法失去焦点 类型转换的问题 如何在DropDownList实现像2005中输入的时候会给出可选项(WEB和WIN FORM都要) 关于c#调用c++dll的问题 关于ArrayList的元素读取问题。 C#实现XML搜索 新手上路 大家指导下 谁知道:服务器端应该安装什么组件才可以运行用c#写的asp.net程序?装了之后对asp3.0程序有什么影响?(无正文) 图片倾斜 旋转 合并 水印 有关DevExpress中chartTable的问题? c# c#正则表达式 取指定<img 的src
static class Program
{
private static void Main()
{
var hNotePad = FindWindow("Notepad", null);
if (hNotePad == IntPtr.Zero)
throw new Exception("notepad 没有打开"); IntPtr hDialog = IntPtr.Zero;
EnumWindows((hwnd, lParam) =>
{
var owner = GetWindow(hwnd, GW_OWNER);
if (owner == hNotePad)
hDialog = hwnd;
return true;
}, IntPtr.Zero);
if (hDialog == IntPtr.Zero)
throw new Exception("请先打开字体对话框"); var sb = new StringBuilder(250);
GetWindowText(hDialog, sb, 250);
if (sb.ToString() != "字体")
throw new Exception("打开的不是字体对话框"); var hCombobox = GetDlgItem(hDialog, 0x470); Console.WriteLine("--------- 对话框上的控件列表 --------");
EnumChildWindows(hDialog, (hChild, _) =>
{
var id = GetDlgCtrlID(hChild);
var sb2 = new StringBuilder(250);
GetClassName(hChild, sb, 250);
GetWindowText(hChild, sb2, 250);
Console.WriteLine("0x{0:x} (id = 0x{1:x}) : {2} (\"{3}\")", hChild, id, sb, sb2);
return true;
}, IntPtr.Zero); var item = "华文中宋";
var index = SendMessage(hCombobox, CB_FINDSTRING, 0, item); Console.WriteLine("选取'{0}', index={1}", item, index);
SendMessage(hCombobox, CB_SELECTSTRING, 0, item);
} public delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam); [DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")]
private static extern IntPtr GetWindow(IntPtr hWnd, int uCmd); [DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")]
private static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); [DllImport("user32.dll")]
private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("user32.dll")]
private static extern int GetDlgCtrlID(IntPtr hwndCtl); [DllImport("user32.dll")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, int wParam, IntPtr lParam); [DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, int wParam, string lParam); private const int GW_OWNER = 4;
private const int CB_FINDSTRING = 0x014C;
private const int CB_SELECTSTRING = 0x014D;
private const int CB_SETCURSEL = 0x014E;
}