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 签名的调用约定和参数与非托管的目标签名是否匹配。

请高人予以指点。

参考技术A 哈哈,你有个地方写错了
//查找子窗体
[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

参考技术B
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);

如何在该父窗口中获取 secondthird 或“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 获取子窗体时 出异常的主要内容,如果未能解决你的问题,请参考以下文章

C# 获取窗体的句柄和获取窗体中的空间

C# 使用 FindWindowEx 按名称和序号获取子句柄

vb里面用findwindowex查找不到东西

vb里面用findwindowex查找不到东西

c#用toolstripbutton打开子窗体

C# winform怎么实现子窗体关闭时刷新父窗体数据