C++, Win API를 사용하여 마우스 클릭시 후크를 설정해야합니다. 바탕 화면의 아이콘을 클릭하면 이벤트가 발생합니다. 어떻게 될까요? 마우스 훅 이벤트에서 얻는 유일한 정보는 마우스 좌표입니다. 맞습니까? 이제 내가 클릭 한 것이 바탕 화면의 아이콘인지 어떻게 확인합니까?특정 창에서 마우스 훅
답변
DLL에 마우스 훅을 구현하고 SetWindowsHookEx()를 사용하여 데스크톱 창을 관리하는 스레드에 대한 훅을 설치하십시오. 해당 스레드 ID를 가져 오려면 GetDesktopWindow() 및 GetWindowThreadProcessId()를 사용하십시오. 그러면 훅이 트리거 될 때마다 훅이 사용자가 클릭하고있는 창과 수행중인 마우스 조작을 알려줍니다. GetClassName()을 사용하여 후크를 트리거하는 윈도우가 ListView인지 확인한 다음 ListView API를 사용하여 제공된 마우스 좌표에서 해당 아이콘 정보에 대해 윈도우를 쿼리합니다.
마우스 버튼을 클릭 한 창을 어떻게 알 수 있습니까? – akif
후크는 현재 마우스 이벤트가 발생하고있는 윈도우의 정확한 HWND를 제공합니다. –
WH_MOUSE 후크에 대한 Microsoft의 설명서를 읽으십시오. –
MSDN의 Microsoft Active Accessibility 및 SetWinEventHook을 확인하십시오. 나는 그것을 효과적으로 사용하여 달성 할 수 있다고 생각합니다.
이 코드는 내가 만든 후크 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);
}
}
}
}
- 1. 최소화 된 창에서 마우스 클릭 시뮬레이션
- 2. Windows에서 다른 프로세스의 창에서 마우스 커서를 변경하십시오.
- 3. GTK : 창에서 마우스 클릭의 좌표를 가져옵니다.
- 4. SVN 클라이언트 측 훅
- 5. Emacs의 파일 확장자 훅
- 6. SVN 훅 스크립트 충돌
- 7. 글로벌 훅 DLL에 적용
- 8. Colorbox - 특정 창에서 닫기 버튼 제거
- 9. WPF 창에서 특정 컨트롤 가져 오기?
- 10. 다중 플롯 창에서 특정 플롯에 플롯합니까?
- 11. OSX : 훅 파일 읽기 이벤트
- 12. Liferay 훅 오버라이드 현재 JS
- 13. 스칼라의 훅 패턴
- 14. 성공적인 설치 후 훅
- 15. PHP : MySQL 오류 훅?
- 16. Liferay 자동 로그인 훅
- 17. MySQL - 시작 훅
- 18. 드루팔 (Drupal) 훅 - 등록
- 19. 리눅스에서 훅 파일 저장
- 20. git에서 커밋 훅 처리하기
- 21. Java/SWT : 포함 된 창에서 마우스 이벤트를 수신하는 방법
- 22. 리눅스에서 pygtk (gtk.gdk)가있는 데스크탑/루트 창에서 키보드/마우스 이벤트
- 23. 특정 컨트롤을 통해 마우스 위치를 얻는 방법
- 24. 특정 마우스 좌표에서 jQuery 트리거 이벤트
- 25. windows-scripting-host가있는 종료 훅
- 26. 스프링 2.5에 셧다운 훅 등록하기
- 27. 자동으로 실행되지 않는 자식 훅
- 28. 포스트 커밋 훅 with Trac
- 29. 훅 DLL 초기화 한 번
- 30. SetWindowsHookEx를 사용하는 프로세스 전체 훅
귀하의 필요 사항을 자세히 설명해야한다고 생각합니다. 아이콘이 시작될 때 알림을 원하십니까? 항상 모든 아이콘을 모니터링하거나 특정 상황에서 사용자가 아이콘을 클릭 할 때까지 기다려야합니까? – Elemental
아니요, 아이콘을 클릭하기 만하면 사용자를 모니터링해야합니다. 그런 다음 아이콘 세부 정보, 아이콘 이름 등을 가져와야합니다. – akif