快速准确找到窗口——使用findwindowexa函数

作者:贺州淘贝游戏开发公司 阅读:78 次 发布时间:2023-05-15 17:05:48

摘要:  在Windows操作系统中,窗口是一个非常重要的概念。在使用程序的过程中,我们经常需要查找某一个窗口来进行各种操作,比如最大化、最小化、移动、关闭等。那么,如何快速、准确地找到需要操作的窗口呢?这就需要用到Win32 API中的findwindowexa函数。  一、什么是findwi...

  在Windows操作系统中,窗口是一个非常重要的概念。在使用程序的过程中,我们经常需要查找某一个窗口来进行各种操作,比如最大化、最小化、移动、关闭等。那么,如何快速、准确地找到需要操作的窗口呢?这就需要用到Win32 API中的findwindowexa函数。

快速准确找到窗口——使用findwindowexa函数

  一、什么是findwindowexa函数

  findwindowexa函数是Windows API中的一个函数,可以用于查找一个指定类名或窗口名的顶层窗口或子窗口。它的定义如下:

  HWND WINAPI FindWindowExA(

   HWND hwndParent, // 父窗口句柄

   HWND hwndChildAfter, // 子窗口句柄

   LPCSTR lpszClass, // 窗口类名

   LPCSTR lpszWindow // 窗口名

  );

  其中,参数hwndParent表示要查找的窗口的直接父窗口的句柄;hwndChildAfter表示在查找时从哪个子窗口开始;lpszClass表示要查找的窗口类名;lpszWindow表示要查找的窗口名。

  函数返回查找到的窗口句柄,如果未找到则返回NULL。

  二、如何使用findwindowexa函数

  下面通过一个示例来演示如何使用findwindowexa函数。

  假设我们要查找Windows系统中的记事本程序(notepad.exe)打开的窗口,并将它移动到屏幕中央。

  1. 先打开记事本程序,然后在桌面上右击,选择“新建”->“文本文档”,将文本文档另存为“test.txt”,关闭记事本程序。

  2. 打开Visual Studio 2019,新建一个Windows控制台应用程序,将文件名改为“findwindowexa_demo”。

  3. 在main函数中,添加以下代码:

  #include

  #include

  using namespace std;

  int main()

  {

   HWND hwndNotepad = FindWindowExA(NULL, NULL, "Notepad", "test.txt - 记事本");

   if (hwndNotepad != NULL)

   {

   // 获取屏幕的宽度和高度

   int screenWidth = GetSystemMetrics(SM_CXSCREEN);

   int screenHeight = GetSystemMetrics(SM_CYSCREEN);

   // 获取窗口的位置和大小

   RECT rect;

   GetWindowRect(hwndNotepad, &rect);

   // 计算窗口移动后的位置

   int newLeft = (screenWidth - rect.right + rect.left) / 2;

   int newTop = (screenHeight - rect.bottom + rect.top) / 2;

   // 移动窗口

   SetWindowPos(hwndNotepad, NULL, newLeft, newTop, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

   }

   else

   {

   cout << "未找到相应的窗口!" << endl;

   }

   return 0;

  }

  首先,使用FindWindowExA函数查找窗口句柄。第一个参数hwndParent传入NULL,表示查找所有顶层窗口;第二个参数hwndChildAfter也传入NULL,表示从第一个子窗口开始查找(在这里没有子窗口,所以无所谓);第三个参数lpszClass传入"Notepad",表示要查找的窗口类名为“Notepad”;第四个参数lpszWindow传入"test.txt - 记事本",表示要查找的窗口名为“test.txt - 记事本”。

  如果findwindowexa函数返回了一个窗口句柄,即成功找到了相应的窗口,接下来就可以进行各种操作了。在这个示例中,我们将窗口移动到屏幕中央。首先,使用GetSystemMetrics函数获取屏幕的宽度和高度。然后,使用GetWindowRect函数获取窗口的位置和大小。注意,GetWindowRect函数的第二个参数必须传入指向RECT结构体的指针,这个结构体包含了窗口的左上角和右下角的坐标。接下来,计算窗口移动后的位置。在本例中,我们将窗口移动到屏幕中央,所以新的左边界坐标为:(屏幕宽度 - 窗口宽度) / 2,新的上边界坐标为:(屏幕高度 - 窗口高度) / 2。最后,使用SetWindowPos函数将窗口移动到计算出的新位置。

  如果findwindowexa函数返回NULL,表示未能找到相应的窗口,我们就在控制台输出一个错误信息。

  三、需要注意什么

  在使用findwindowexa函数时,需要注意以下几点:

  1. 参数lpszClass和lpszWindow是大小写敏感的。如果指定的类名或窗口名与实际不符,函数将返回NULL。

  2. 当使用该函数查找任何窗口时,尤其是使用窗口类名查找子窗口时,请确保使用完整的窗口类名。例如,在本例中,我们使用了完整的窗口类名"Notepad",而不是简单的"notepad"。

  3. 在多线程应用程序中使用findwindowexa函数时,可以在主线程中使用该函数,但是在从其它线程使用该函数时,需要注意线程安全性问题。

  4. findwindowexa函数只能用于查找顶层窗口和子窗口。如果需要查找其他类型的窗口,需要使用其他函数。

  四、结语

  findwindowexa函数是Windows操作系统中非常重要的一个函数,它可以帮助我们快速、准确地找到需要操作的窗口,使得程序的用户界面变得更加友好和易用。在使用该函数时,需要注意参数的大小写以及线程安全性问题等细节。相信通过本文的学习,读者已经对findwindowexa函数有了更深入的了解,可以在实际编程中熟练地运用它了。

  • 原标题:快速准确找到窗口——使用findwindowexa函数

  • 本文链接:https://qipaikaifa1.com/tb/3527.html

  • 本文由贺州淘贝游戏开发公司小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与淘贝科技联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:189-2934-0276


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部