我是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 文档充其量让我感到困惑。
任何帮助或见解将不胜感激!我在网上找不到任何示例代码。谢谢!
是一个好主意,因为资源管理器可以自由地以它想要的任何方式实现 shell 视图,并且在 Windows 7 及更高版本中,资源管理器窗口不再使用 listview,默认情况下它使用自定义控件!
如果您只关心显示名称并调用可以使用 UI 自动化的默认操作,它应该也适用于其他类型的窗口/控件,而不仅仅是 shell 文件列表。
如果您需要知道完整路径和其他详细信息,您可以使用IShellWindows界面。例子可以在Raymond Chens的博客上找到 这里 和 这里...