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

时间:2017-01-30 19:32:55

标签: c++ windows

我是shell编程的新手,无法获取有关在窗口(桌面或其他方面)中单击哪个项目的文件路径(或实际上,任何信息)。我遵循Can i use Global System Hooks to capture which file was clicked on?答案所规定的一般路径,但我没有运气。

点击是这里较小的问题,因此我只是替换了鼠标位置的随机值(我知道桌面位置和文件应该位于何处)。 (无论如何,即使我在鼠标的当前位置上尝试这一点,它也无法工作。)

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文档充其量让我感到困惑。

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

1 个答案:

答案 0 :(得分:1)

直接使用listview并不是一个好主意,因为Explorer可以任意方式自由地实现shell view,在Windows 7及更高版本中,资源管理器窗口不再使用listview,它使用自定义默认控制!

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

如果您需要了解完整路径和其他详细信息,可以使用IShellWindows interface。可以在Raymond Chens博客herehere ...

上找到示例