鱼C论坛

 找回密码
 立即注册
查看: 433|回复: 2

桌面图标位置

[复制链接]
发表于 2023-4-21 07:17:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一般都是双击桌面的图标启动程序的

比如:现在我想让程序自动寻找桌面的QQ图标的坐标,如何寻找  ??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-21 11:42:37 | 显示全部楼层
要在Windows的MFC编程中自动寻找桌面上特定图标的坐标,可以通过以下几个步骤来实现:

1. 获取桌面窗口句柄:

  1. HWND hDesktop = ::FindWindow(_T("Progman"), _T("Program Manager"));
复制代码


2. 遍历桌面窗口的子窗口以获取所有图标:

  1. BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
  2. {
  3.     TCHAR className[MAX_PATH];
  4.     ::GetClassName(hWnd, className, MAX_PATH);
  5.     if (_tcscmp(className, _T("SHELLDLL_DefView")) == 0)
  6.     {
  7.         // 获取桌面图标所在的列表视图句柄
  8.         HWND hListView = ::FindWindowEx(hWnd, NULL, _T("SysListView32"), NULL);

  9.         // 调用查找图标的函数
  10.         FindQQIcon(hListView);
  11.     }
  12.     return TRUE;
  13. }

  14. ::EnumChildWindows(hDesktop, EnumChildProc, NULL);
复制代码


3. 在查找图标的函数中遍历列表视图中的所有项目,找到需要的图标:

  1. void FindQQIcon(HWND hListView)
  2. {
  3.     int nItemCount = ListView_GetItemCount(hListView);
  4.     LVITEM item;
  5.     TCHAR szText[MAX_PATH];

  6.     for (int i = 0; i < nItemCount; i++)
  7.     {
  8.         memset(&item, 0, sizeof(LVITEM));
  9.         item.mask = LVIF_TEXT;
  10.         item.iItem = i;
  11.         item.pszText = szText;
  12.         item.cchTextMax = MAX_PATH;
  13.         
  14.         ListView_GetItem(hListView, &item);
  15.         
  16.         // 如果找到了"QQ"图标
  17.         if (_tcsstr(szText, _T("QQ")) != NULL)
  18.         {
  19.             // 获取图标的矩形区域
  20.             RECT rect;
  21.             ListView_GetItemRect(hListView, i, &rect, LVIR_ICON);

  22.             // 计算图标的中心坐标
  23.             POINT ptIcon;
  24.             ptIcon.x = rect.left + (rect.right - rect.left) / 2;
  25.             ptIcon.y = rect.top + (rect.bottom - rect.top) / 2;

  26.             // 在此处处理找到的图标坐标,例如将其保存在全局变量中
  27.             // g_ptQQIcon = ptIcon;
  28.             break;
  29.         }
  30.     }
  31. }
复制代码


上述代码示例遍历了桌面的图标,找到名为"QQ"的图标,并计算了它的中心坐标。当然,这只是一个示例,您可以根据需要修改查找条件和处理逻辑。

注意:这段代码需要包含以下头文件和库文件:

  1. #include <Windows.h>
  2. #include <tchar.h>
  3. #include <CommCtrl.h>

  4. #pragma comment(lib, "Comctl32.lib")
复制代码


同时,您可能需要在项目设置中定义 _WIN32_IE 和 _WIN32_WINNT 的值。例如,将这些宏定义添加到预编译头中:

  1. #define _WIN32_IE 0x0300
  2. #define _WIN32_WINNT 0x0501
复制代码



假设你已经成功获取了QQ图标的坐标,接下来你可能想要根据获取到的坐标执行一些操作。例如,你可以将鼠标移动到图标的位置并执行双击打开它。

要实现这个功能,你需要调用 `SetCursorPos` 函数设置鼠标位置,然后使用 `mouse_event` 函数(或 `SendInput`)模拟鼠标点击。以下是一个示例:

  1. // 假设我们已经获取到了QQ图标的中心坐标,存储在 POINT ptIcon 结构中

  2. // 移动鼠标到图标位置
  3. ::SetCursorPos(ptIcon.x, ptIcon.y);

  4. // 模拟鼠标左键按下
  5. ::mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

  6. // 延时一小段时间,模拟人类操作
  7. ::Sleep(100);

  8. // 模拟鼠标左键抬起
  9. ::mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

  10. // 延时一小段时间,模拟人类操作
  11. ::Sleep(100);

  12. // 再次模拟鼠标左键按下
  13. ::mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);

  14. // 延时一小段时间,模拟人类操作
  15. ::Sleep(100);

  16. // 再次模拟鼠标左键抬起
  17. ::mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
复制代码


注意:上述代码只是一个简单的示例,实际应用中可能需要考虑其他因素,如检查目标窗口是否已打开、确保程序在各种屏幕分辨率下都能正常工作等。

这样,你的程序就能实现自动寻找桌面上的QQ图标的坐标,并根据坐标模拟鼠标双击操作。你可以将这些代码集成到你的MFC应用程序中,并根据实际需求进行适当的调整。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-22 10:04:26 | 显示全部楼层


要让程序自动寻找桌面上QQ图标的坐标,可以使用自动化工具来实现。以下是可能的步骤:

1. 使用自动化工具,如AutoHotkey、Selenium等,打开桌面。

2. 使用自动化工具中的图像识别功能,在桌面上搜索QQ图标的图像。可以使用QQ图标的截图来进行搜索。

3. 找到QQ图标的位置后,使用自动化工具中的坐标识别功能,获取QQ图标的坐标。

4. 将QQ图标的坐标保存到程序中,以便后续使用。

需要注意的是,自动化工具的具体操作方式可能因工具而异,具体实现方式需要根据具体工具的使用文档进行。另外,程序需要在桌面启动后才能进行搜索,因此需要考虑延迟等待桌面加载完成的时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 21:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表