解决Windows下qt拖出文件无法获取路径问题。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值