在窗口或桌面窗口中单击文件



我是shell编程的新手,无法获取有关在窗口(桌面或其他)中单击哪个项目的文件路径(或任何信息)。我正在遵循答案中列出的一般路径 我可以使用全局系统挂钩来捕获单击的文件吗?但我没有任何运气。

单击是这里的小问题,所以我只是用随机值(我知道桌面的位置和文件应该在哪里)代替鼠标位置。(无论如何,即使我在鼠标的当前位置尝试此操作,它也不起作用)。

LVHITTESTINFO hitTest = { 0 };
hitTest.pt.x = 55;
hitTest.pt.y = 230;
hitTest.flags = LVHT_ONITEM;
currWindow = WindowFromPoint(pt);
    int index = ListView_HitTest(currWindow, &hitTest);
    //cout << index + " index";
    //cout << hitTest.iItem + " iltem "; 
    if (index != -1) {
        //char* itemText = new char[256];
        std::vector<wchar_t> itemText(1024);
        ListView_GetItemText(window, index, 0, &itemText[0], 256);
        PIDLIST_ABSOLUTE filepidl;
        SFGAOF out;
        std::wstring strtext = std::wstring(itemText.begin(), itemText.end());
        //cout << " ";
        //cout << *(strtext.c_str()) + " ";
        HRESULT parse = SHParseDisplayName(strtext.c_str(), NULL, &filepidl, SFGAO_CANDELETE, &out);
        if (filepidl != NULL) {
            LPTSTR filePath = new TCHAR[MAX_PATH];
            BOOL getPath = SHGetPathFromIDList(filepidl, filePath);
            cout << *filePath ;
        }
    }

这是我代码的一部分。我认为我获取文件索引的方式有问题,因为它一直返回 0,但我已经为此进行了几天的黑客攻击并且被卡住了。MSDN 文档充其量让我感到困惑。

任何帮助或见解将不胜感激!我在网上找不到任何示例代码。谢谢!

像这样直接使用 listview 不

是一个好主意,因为资源管理器可以自由地以它想要的任何方式实现 shell 视图,并且在 Windows 7 及更高版本中,资源管理器窗口不再使用 listview,默认情况下它使用自定义控件!

如果您只关心显示名称并调用可以使用 UI 自动化的默认操作,它应该也适用于其他类型的窗口/控件,而不仅仅是 shell 文件列表。

如果您需要知道完整路径和其他详细信息,您可以使用IShellWindows界面。例子可以在Raymond Chens的博客上找到 这里 和 这里...

最新更新