此代码在我创建的挂钩 DLL 中工作。我认为这里的问题是从图标中获取文本等内容很容易,但弄清楚如何访问快捷方式下的应用程序完全是另一个问题。这是位于管理列表视图的应用程序中的知识,在本例中为资源管理器。
请原谅我拼命地过时的代码,我把这个测试硬塞进了一个旧的 ANSI 钩子 DLL。 DebugStr 只是 OutputDebugString 的包装器。该代码基于 Remy 的发布。
LRESULT DLL_CALL MouseFunc (int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL bGoActive = TRUE;
char szDebug [200];
char szBuff [100];
MOUSEHOOKSTRUCT * pmhs = (MOUSEHOOKSTRUCT *)lParam;
LVFINDINFO lvfi;
LVITEM lvi;
int iIndexItem;
long lx = pmhs->pt.x;
long ly = pmhs->pt.y;
if (nCode >= 0)
{
if (wParam == WM_LBUTTONDOWN)
{
GetClassName (pmhs->hwnd, szBuff, sizeof(szBuff));
wsprintf (szDebug, "wparam=0x%X, nCode=%d, HTC=%d, class='%s', x=%d, y=%d",
wParam, nCode, pmhs->wHitTestCode, szBuff, lx, ly);
DebugStr (szDebug);
if (strcmpi (szBuff, TEXT("SysListView32")) == 0)
{
ZeroMemory (&lvfi, sizeof(lvfi));
lvfi.flags = LVFI_NEARESTXY;
lvfi.pt.x = lx;
lvfi.pt.y = ly;
ScreenToClient (pmhs->hwnd, &(lvfi.pt));
lvfi.vkDirection = VK_NEXT;
iIndexItem = ListView_FindItem (pmhs->hwnd, -1, &lvfi);
if (iIndexItem != -1)
{
ZeroMemory (&lvi, sizeof(lvi));
lvi.mask = LVIF_TEXT;
lvi.iItem = iIndexItem;
lvi.pszText = szBuff;
lvi.cchTextMax = sizeof(szBuff);
if (ListView_GetItem (pmhs->hwnd, &lvi))
{
wsprintf (szDebug, "item text = '%s'", szBuff);
DebugStr (szDebug);
}
}
}
}