我是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文档充其量让我感到困惑。
任何帮助或见解将不胜感激!我无法在线找到任何示例代码。谢谢!
答案 0 :(得分:1)
直接使用listview并不是一个好主意,因为Explorer可以任意方式自由地实现shell view,在Windows 7及更高版本中,资源管理器窗口不再使用listview,它使用自定义默认控制!
如果您只关心显示名称并调用默认操作,则可以使用UI Automation,它也应该适用于其他类型的窗口/控件,而不仅仅是shell文件列表。
如果您需要了解完整路径和其他详细信息,可以使用IShellWindows interface。可以在Raymond Chens博客here和here ...
上找到示例