lm68140318 发表于 2023-4-21 07:17:02

桌面图标位置

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

比如:现在我想让程序自动寻找桌面的QQ图标的坐标,如何寻找??

isdkz 发表于 2023-4-21 11:42:37

要在Windows的MFC编程中自动寻找桌面上特定图标的坐标,可以通过以下几个步骤来实现:

1. 获取桌面窗口句柄:

HWND hDesktop = ::FindWindow(_T("Progman"), _T("Program Manager"));


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

BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
    TCHAR className;
    ::GetClassName(hWnd, className, MAX_PATH);
    if (_tcscmp(className, _T("SHELLDLL_DefView")) == 0)
    {
      // 获取桌面图标所在的列表视图句柄
      HWND hListView = ::FindWindowEx(hWnd, NULL, _T("SysListView32"), NULL);

      // 调用查找图标的函数
      FindQQIcon(hListView);
    }
    return TRUE;
}

::EnumChildWindows(hDesktop, EnumChildProc, NULL);


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

void FindQQIcon(HWND hListView)
{
    int nItemCount = ListView_GetItemCount(hListView);
    LVITEM item;
    TCHAR szText;

    for (int i = 0; i < nItemCount; i++)
    {
      memset(&item, 0, sizeof(LVITEM));
      item.mask = LVIF_TEXT;
      item.iItem = i;
      item.pszText = szText;
      item.cchTextMax = MAX_PATH;
      
      ListView_GetItem(hListView, &item);
      
      // 如果找到了"QQ"图标
      if (_tcsstr(szText, _T("QQ")) != NULL)
      {
            // 获取图标的矩形区域
            RECT rect;
            ListView_GetItemRect(hListView, i, &rect, LVIR_ICON);

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

            // 在此处处理找到的图标坐标,例如将其保存在全局变量中
            // g_ptQQIcon = ptIcon;
            break;
      }
    }
}


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

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

#include <Windows.h>
#include <tchar.h>
#include <CommCtrl.h>

#pragma comment(lib, "Comctl32.lib")


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

#define _WIN32_IE 0x0300
#define _WIN32_WINNT 0x0501



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

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

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

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

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

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

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

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

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

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

// 再次模拟鼠标左键抬起
::mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);


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

这样,你的程序就能实现自动寻找桌面上的QQ图标的坐标,并根据坐标模拟鼠标双击操作。你可以将这些代码集成到你的MFC应用程序中,并根据实际需求进行适当的调整。

陶远航 发表于 2023-4-22 10:04:26



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

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

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

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

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

需要注意的是,自动化工具的具体操作方式可能因工具而异,具体实现方式需要根据具体工具的使用文档进行。另外,程序需要在桌面启动后才能进行搜索,因此需要考虑延迟等待桌面加载完成的时间。
页: [1]
查看完整版本: 桌面图标位置