请教vb中findwindow的用法
请参考:
VB声明
Declare Function FindWindow Lib “user32“ Alias “FindWindowA“ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
说明
寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)
返回值
Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
注解
很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
示例
Dim hw&, cnt&
Dim rttitle As String * 256
hw& = FindWindow(“ThunderRT5Main“, vbNullString) ’ ThunderRTMain under VB4
cnt = GetWindowText(hw&, rttitle, 255)
MsgBox Left$(rttitle, cnt), 0, “RTMain title“
FindWindow怎么获取隐藏窗口的句柄
由于项目需要将matlab绘制出的图形窗口嵌入到VC界面里去。为了有好的显示效果matlab里让窗口先隐藏然后抓到VC界面里再显示出来。由于matlab程序比较复杂是由合作方提供的。不能用COM等形式实现联合编程。
这里遇到的问题是:FindWindow()函数无法找到隐藏的Figure窗口句柄(显示情况下能找到)
由于对Windows理解不够我无从下手。望高手指明方向。。。。
------解决方案--------------------------------------------------------
你用EnumWindow试试
------解决方案--------------------------------------------------------
不管窗口有没有影藏,findwindow都能够找到它,如果它是顶级窗口并且没有经过特殊处理的话。
我猜,你那matlab的figure可能不是顶级窗口,就是不是主程序的窗口,因此,你可以通过枚举的方式来找到子窗口。代码如下,参考下:C/C++
code
CWnd*
cwnd=CWnd::FindWindow(NULL,matlab标题名);//找到matlab的主窗口
CWnd*
child=cwnd-GetWindow(GW_CHILD);//获得matlab的第一个子窗口
CString
buf;
while(child)
{//这里可以判断是不是你那个figure
child-SendMessage(WM_GETTEXT,50,(LPARAM)(buf.GetBuffer(50)));
buf.ReleaseBuffer();
if
(buf==发送){child-PostMessage(WM_LBUTTONDOWN);
child-PostMessage(WM_LBUTTONUP);break;}else{//child-SendMessage(WM_SETTEXT,0,(LPARAM)hello,this
is
me);}child=(child-GetNextWindow(GW_HWNDNEXT));//获取下一个子窗口}------解决方案--------------------------------------------------------枚举窗口
findwindow用法
CWnd*
phwnd=FindWindow(“CFindWindowFunDlg“,NULL);
前面是类名,后面窗口名。或者用spy++确认一下类名是否正确。
C++ FindWindow函数使用
这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。有的窗口的标题是比较容易得到的,如“计算器“,所以搜索时应使用标题进行搜索。但有的软件的标题不是固定的,如“记事本“,如果打开的文件不同,窗口标题也不同,这时使用窗口类搜索就比较方便。如果找到了满足条件的窗口,这个函数返回该窗口的句柄,否则返回0。
前面提到的VB的FindWindow()函数的声明将两个参数都定义为String类型,而在实际使用过程中,如果我们忽略某个参数就将该参数的定义又As String改为As Any。这里的As Any相当于C语言中的强制类型转换。例如,如果我们忽略窗口的类,就将定义修改如下:
Declare Function FindWindow Lib “user32“ Alias “FindWindowA“ (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
然后,在调用时使用如下语句:
hwndCalc = FindWindow(0&, “计算器“)
这里的0&就表示忽略类名。需要注意的是FindWindow(0&, “计算器“)和FindWindow(““, “计算器“)有两种完全不同的含义,前者表示忽略窗口的类,而后者表示窗口的类是个空串。类似的,我们也可以忽略标题而搜索指定的类。
从上面的讨论中可以看出,如果要搜索的外部程序的窗口标题比较容易得到,问题是比较简单的。可如果窗口的标题不固定或者根本就没有标题,怎么得到窗口的类呢?如果你安装了Visual C++,你可以使用其中的Spy++(如果没有VC++,在VB的盘上也可以找到Spy),在Spy++中有一个FindWindow工具,它允许你使用鼠标选择窗口,然后Spy++会显示这个窗口的类。
是否可以解决您的问题?
findwindowA 和findwindow 有什么区别
#ifdef UNICODE
#define FindWindow FindWindowW
#else
#define FindWindow FindWindowA
#endif // !UNICODE
编译器会给程序指定当前字符集。
如果是ANSI字符集 则FindWindow完全等同于FindWindowA。
如果是Unicode字符集,则FindWindow完全等同于FindWindowW,而FindWindowA此时与FindWindow完全是两个不同函数。
也就是说,Windows中不存在名为FindWindow的函数,仅存在FindWindowA和FindWindowW。而FindWindow实际上是被定义的别名。
FindWindow怎么用
Find Window的函数原型:
FindWindow(
lpClassName, {窗口的类名}
lpWindowName: PChar {窗口的标题}
): HWND; {返回窗口的句柄; 失败返回 0}
C语言测试代码(假如要查系统自带的 放大镜 窗口,前提是已经打开放大镜窗口):
HWND h = FindWindow(NULL, “放大镜“);
if(0 == h)
{
ShowMessage(“can’t find 放大镜“);
}
else
{
ShowMessage(IntToStr(h)); //查找到窗口,并且打印出该窗口的句柄
}
C语言中的findwindow()函数参数是什么
1.函数说明:FindWindow,Win32 API函数。
FindWindow函数返回与指定字符串相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。
2.函数原型:
HWND FindWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName
);3.参数说明:
lpClassName
指向一个以null结尾的、用来指定类名的字符串或一个可以确定类名字符串的原子。如果这个参数是一个原子,那么它必须是一个在调用此函数前已经通过GlobalAddAtom函数创建好的全局原子。这个原子(一个16bit的值),必须被放置在lpClassName的低位字节中,lpClassName的高位字节置零。
lpWindowName
指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。
4返回值:
如果函数执行成功,则返回值是拥有指定窗口类名或窗口名的窗口的句柄。
如果函数执行失败,则返回值为 NULL 。可以通过调用GetLastError函数获得更加详细的错误信息。5.使用示例:HWND hWndRcv = ::FindWindow(NULL,“123“);if(hWndRcv != NULL){ AfxMessageBox(“找到123窗口“);}
FindWindow 找不到窗口
解决方法:
在调用FindWindow函数的时候,应该第一个参数为空,第二个参数为窗口的标题名。classname是窗口在创建时的注册名称,不是源代码的类名,通常可以不指定,除非确切地知道。另外,vc自带一个spy++的工具,可以探查当前所有窗口的信息,包括注册类名。
FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。
VB中FindWindow()函数的用法
VB中findwindow()函数使用:
VB声明
Declare Function FindWindow Lib “user32“ Alias “FindWindowA“ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
说明
寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)
返回值
Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
参数表
参数 类型及说明
lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
注解
很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
示例
Dim hw&, cnt&
Dim rttitle As String * 256
hw& = FindWindow(“ThunderRT5Main“, vbNullString) ’ ThunderRTMain under VB4
cnt = GetWindowText(hw&, rttitle, 255)
MsgBox Left$(rttitle, cnt), 0, “RTMain title“
FindWindow()的返回值究竟是什么
FindWindow是典型的窗口类封装API函数,你的困惑在于两种环境下,其实使用的是不同的函数。
win32 SDK编程环境下,::FindWindow是WINAPI函数,返值是句柄;
MFC下,FindWindow使用的是窗口类CWnd::FindWindow函数,返值是窗口类指针。
从MFC移植到SDK,麻烦是不可避免的,只能逐一修改,因为没法用到很多MFC封装的类。
但反过来移植,就容易多了,因为MFC兼容全部API函数。
参考:CWnd类FindWindow实现代码
_AFXWIN_INLINE CWnd* PASCAL CWnd::FindWindow(LPCTSTR lpszClassName, LPCTSTR lpszWindowName)
{ return CWnd::FromHandle(::FindWindow(lpszClassName, lpszWindowName)); }
如果你能使用CWnd类,那么FromHandle就可以获取窗口类指针。