C#获取当前窗体句柄及该窗体里的信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#获取当前窗体句柄及该窗体里的信息相关的知识,希望对你有一定的参考价值。

参考技术A

C#获取当前窗体句柄及该窗体里的信息可以参考以下的代码:

FindWindow(

lpClassName, 窗口的类名

lpWindowName: PChar 窗口的标题

): HWND; 返回窗口的句柄; 失败返回 0

//FindWindowEx 比 FindWindow 多出两个句柄参数:

FindWindowEx(

Parent: HWND; 要查找子窗口的父窗口句柄

Child: HWND; 子窗口句柄

ClassName: PChar;

WindowName: PChar

): HWND;

扩展资料:

句柄语句

HINSTANCE hInstance;

可以改成:

HANDLE hInstance;

上面的2条语句都是对的,表达的是一个意义.

一个WINDOWS应用程序可以用不同的方法获得一个特定项的句柄。许多API函数,诸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。

另外,WINDOWS也能通过应用程序的引出函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WINDOWS环境下的任何地方对这个句柄进行操作。其实句柄的大量使用已经影响到了每一个WINDOWS的程序设计。

参考资料来源:百度百科-句柄

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#获取当前窗体句柄及该窗体里的信息的主要内容,如果未能解决你的问题,请参考以下文章

c# 设置窗体句柄

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

获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

知道一个窗体的句柄,如何获取这个窗体

c# 用 FindWindowEx 获取子窗体时 出异常