Windows API 实现窗口类型检测与信息获取
该方法仅在windows系统可用,使用的是winApi实现的
原理:
获取指针位置
POINT pt;
GetCursorPos(&pt);
用窗口句柄获取到当前窗口的类型
HWND hwnd = WindowFromPoint(pt);
检查是否为资源管理器类型
GetWindowClassName(hwnd) == "DirectUIHWND"
循环获取hwnd的父级窗口
GetParent(parentHwnd);
获取至classname为CabinetWClass停止,这个为最顶级,新建一个HWND存放顶级句柄
HWND parentHwnd = GetParent(hwnd);
为每个子窗口调用一个回调函数
std::vector<HWND> toolbarWindows;
EnumChildWindows(parentHwnd, EnumChildProc, reinterpret_cast<LPARAM>(&toolbarWindows));
找到第一个窗口类型为ToolbarWindow32的子窗口输出它的窗口名称
char path[MAX_PATH];
SendMessageA(hwnd, WM_GETTEXT, sizeof(path), (LPARAM)path);
此时path里存放的就是这个窗口的路径
回到<用窗口句柄获取到当前窗口的类型>这里,如果不是DirectUIHWND则再判断
是否为SysListView32,该窗口类型为桌面
// 获取桌面文件夹路径
wchar_t desktopPath[MAX_PATH];
if (SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY, NULL, SHGFP_TYPE_CURRENT, desktopPath) == S_OK) {
std::wcout << L"Desktop path: " << desktopPath << std::endl;
}
如果不是SysListView32则判断是否直接为ToolbarWindow32类型,输出其窗口名称即可
GetPathFromToolbarWindow(hwnd);
qt部分
拖出功能需要创建一个临时文件,在拖出时鼠标图标上会有+号。
松开鼠标时运行上面c++函数,获取到路径
但由于是获取的窗口句柄,无法判断是否放在该窗口还是该窗口的文件夹里
所有使用循环查找刚刚释放的临时文件实际路径。
仅需判断当前路径以及子文件夹的一级路径即可
千万不要查找子文件的子文件夹,会很慢 :D