FindWindow()的返回值究竟是什么

FindWindow()的返回值究竟是什么,第1张

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就可以获取窗口类指针。

比如 FindWindow(NULL,"WinLIRC");

就是查找你当前所开窗口中,是否有窗口名称为 WinLIRC;

如果有就会返回这个窗口的句柄,如果没有就是INVALID_HANDLE_VALUE。

一般第一个参数可以设为NULL。第二个参数是关键。

解决方法:

在调用FindWindow函数的时候,应该第一个参数为空,第二个参数为窗口的标题名。classname是窗口在创建时的注册名称,不是源代码的类名,通常可以不指定,除非确切地知道。另外,vc自带一个spy++的工具,可以探查当前所有窗口的信息,包括注册类名。

FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。这个函数有两个参数,第一个是要找的窗口的类,第二个是要找的窗口的标题。在搜索的时候不一定两者都知道,但至少要知道其中的一个。

程序前面加函数定义

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

FindWindow函数执行成功后,返回值是拥有指定窗口类名或窗口名的窗口的句柄(类型是Long)。也就是说,你每次重新打开一次“我的电脑”,再FindWindow,返回的值其实都不一样,不过它们都不为零就是了,所以判定有没有找到这个窗口就直接用a>0来判定就可以了。

Private Sub Form_Load()

a = FindWindow("CabinetWClass", "我的电脑")

If a > 0 Then

Text1Text = "找到"

Else

Text1Text = "未找到"

End If

End Sub

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long)As Long

Private Sub Timer1_Timer()

Dim hwnd As Long' 储存 FindWindow 函数返回的句柄

hwnd = FindWindow(vbNullString, "Windows Media Player")' 取得进程标识符

If hwnd = 0 Then

Label1Caption = "未运行"

Else

Label1Caption = "已运行"

End If

End Sub

你的原码,测试通过,并未发现任何错误

你把你的程序发上来看看,

Timer1_Timer() 没初始化根本就不会运行的

我加出来会和你程序里的不太一样

我在form_load()加入timer1的初始程序

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Sub Form_Load()

Timer1Enabled = True

Timer1Interval = 1000

End Sub

Private Sub Timer1_Timer()

Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄

hwnd = FindWindow(vbNullString, "Windows Media Player") ' 取得进程标识符

If hwnd = 0 Then

Label1Caption = "未运行"

Else

Label1Caption = "已运行"

End If

End Sub

没打开WMP的情况下

结果:未运行

打开WMP的情况下

结果:已运行

Find Window的函数原型:

FindWindow(

lpClassName, {窗口的类名}

lpWindowName: PChar {窗口的标题}

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

C语言测试代码(假如要查系统自带的 放大镜 窗口,前提是已经打开放大镜窗口):

HWND h = FindWindow(NULL, "放大镜");

if(0 == h)

{

ShowMessage("can't find 放大镜");

}

else

{

ShowMessage(IntToStr(h)); //查找到窗口,并且打印出该窗口的句柄

}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12157722.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存