2009-10-28 7 views
0

C++, Win API를 사용하여 마우스 클릭시 후크를 설정해야합니다. 바탕 화면의 아이콘을 클릭하면 이벤트가 발생합니다. 어떻게 될까요? 마우스 훅 이벤트에서 얻는 유일한 정보는 마우스 좌표입니다. 맞습니까? 이제 내가 클릭 한 것이 바탕 화면의 아이콘인지 어떻게 확인합니까?특정 창에서 마우스 훅

+0

귀하의 필요 사항을 자세히 설명해야한다고 생각합니다. 아이콘이 시작될 때 알림을 원하십니까? 항상 모든 아이콘을 모니터링하거나 특정 상황에서 사용자가 아이콘을 클릭 할 때까지 기다려야합니까? – Elemental

+0

아니요, 아이콘을 클릭하기 만하면 사용자를 모니터링해야합니다. 그런 다음 아이콘 세부 정보, 아이콘 이름 등을 가져와야합니다. – akif

답변

1

DLL에 마우스 훅을 구현하고 SetWindowsHookEx()를 사용하여 데스크톱 창을 관리하는 스레드에 대한 훅을 설치하십시오. 해당 스레드 ID를 가져 오려면 GetDesktopWindow() 및 GetWindowThreadProcessId()를 사용하십시오. 그러면 훅이 트리거 될 때마다 훅이 사용자가 클릭하고있는 창과 수행중인 마우스 조작을 알려줍니다. GetClassName()을 사용하여 후크를 트리거하는 윈도우가 ListView인지 확인한 다음 ListView API를 사용하여 제공된 마우스 좌표에서 해당 아이콘 정보에 대해 윈도우를 쿼리합니다.

+0

마우스 버튼을 클릭 한 창을 어떻게 알 수 있습니까? – akif

+0

후크는 현재 마우스 이벤트가 발생하고있는 윈도우의 정확한 HWND를 제공합니다. –

+0

WH_MOUSE 후크에 대한 Microsoft의 설명서를 읽으십시오. –

0

MSDN의 Microsoft Active Accessibility 및 SetWinEventHook을 확인하십시오. 나는 그것을 효과적으로 사용하여 달성 할 수 있다고 생각합니다.

0

이 코드는 내가 만든 후크 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); 
       } 
      } 
     } 
     }