c# 用 FindWindowEx 获取子窗体时 出异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 用 FindWindowEx 获取子窗体时 出异常相关的知识,希望对你有一定的参考价值。
//查找父级窗体
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
//查找子窗体
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
以下是调用。
//网页弹出消息
IntPtr maindHwnd = FindWindow(null, "来自网页的消息"); //获得 弹出窗口 句柄
if (maindHwnd != IntPtr.Zero)
IntPtr childHwnd = FindWindowEx(maindHwnd, new IntPtr(0), "Button", "确定"); //获得按钮的句柄
else
richTextBox1.Text += "没有找到窗口\n";
I当程序执行到:
ntPtr childHwnd = FindWindowEx(maindHwnd, new IntPtr(0), "Button", "确定"); //获得按钮的句柄
会出现如下异常:
对 PInvoke 函数“WindowsFormsApplication5!WindowsFormsApplication5.Form3::FindWindowEx”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
请高人予以指点。
//查找子窗体
[DllImport("user32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", EntryPoint = "FindWindow")]应该把EntryPoint = "FindWindow"改为EntryPoint = "FindWindowEx",或者直接 [DllImport("user32.dll")]追问
万分感谢…一直没看声明的部分
我改过来后,能正常运行了,可是依然获取不到子窗体,你能指点一下吗?
如果解决问题,我再给你加分。
网页弹出窗如下:
我想获取 子窗体的句柄,比如“Web message.”窗体的句柄,若何操作?
谢谢
这个还没试过,你用FindWindow(null, "来自网页的消息")获取句柄试试,不行的话用SPy++获取这个窗口的类名称,然后代替null
good luck
else /*正常删除子串的情况*/
j=i;
while(S.ch[j-1+len]!='\0') /*把要删除子串后的字符串前移len个位置*/
S.ch[j-1]=S.ch[j-1+len];
j++;
S.len=S.len-len; /*修改字符串长度*/
S.ch[S.len]='\0'; /*存放字符串结束标志*/本回答被提问者采纳 参考技术C IntPtr.Zero 与 new IntPtr(0)一样吗?
C# 使用 FindWindowEx 按名称和序号获取子句柄
【中文标题】C# 使用 FindWindowEx 按名称和序号获取子句柄【英文标题】:C# get child handles using FindWindowEx by name and ordinal number 【发布时间】:2011-08-06 02:20:13 【问题描述】:根据http://msdn.microsoft.com/en-us/library/ms633500(v=vs.85).aspx我定义了FindWindowEx函数。
using System.Runtime.InteropServices;
[DllImport("user32.dll", CharSet=CharSet.Unicode)]
static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);
现在我可以找到将 childAfter 设置为 IntPtr.Zero 的“Button”控件的 first 句柄(从 Spy++ 获取名称)。
IntPtr hWndParent = new IntPtr(2032496); // providing parent window handle
IntPtr hWndButton = FindWindowEx(hWndParent, IntPtr.Zero, "Button", string.Empty);
如何在该父窗口中获取 second、third 或“Button”控件的任何句柄?事实上,按钮标题可能会有所不同,因此我无法通过定义第四个参数的名称直接找到它们。
【问题讨论】:
请重新表述您的问题以便我们理解。 为什么不使用 UIAutomation 命名空间? 我的解决方案可用于非托管 C++ 程序,sn-p 也是如此 :) 这是用于挖掘/黑客攻击,而不是用于测试目的。不喜欢研究中的任何即用型自动化。 【参考方案1】:static IntPtr FindWindowByIndex(IntPtr hWndParent, int index)
if (index == 0)
return hWndParent;
else
int ct = 0;
IntPtr result = IntPtr.Zero;
do
result = FindWindowEx(hWndParent, result, "Button", null);
if (result != IntPtr.Zero)
++ct;
while (ct < index && result != IntPtr.Zero);
return result;
像这样使用:
IntPtr hWndThirdButton = FindWindowByIndex(hWnd, 3); // handle of third "Button" as shown in Spy++
【讨论】:
以上是关于c# 用 FindWindowEx 获取子窗体时 出异常的主要内容,如果未能解决你的问题,请参考以下文章