powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отлов мышей
4 сообщений из 4, страница 1 из 1
Отлов мышей
    #34255419
_Rashid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть приложение которое должно ловить координаты курсора мыши путем установки хука WH_MOUSE .
DLL и приложение работают, но координаты считываются только тогда, когда курсов находится над окном приложения, хотя дожно ловить по всему экрану. Никак не могу понять причину тако работы. Может кто-то сталкивался раньше с подобным?
Код DLL и приложения привожу ниже.
Код DLL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
#include <afxwin.h>

#define DLLEXPORT extern "C" __declspec(dllexport)

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

class CTestIdleUIDll : public CWinApp {
public:
	CTestIdleUIDll()  { }
	~CTestIdleUIDll() { }
} theDll;

#pragma data_seg (".IdleUI")
HHOOK g_hHookMouse = NULL;
POINT ret;
#pragma data_seg ()

DLLEXPORT POINT IdleUIGetLastInputTime()
{
	return ret;
}

LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam)
{
	if (code==HC_ACTION) 
		if(wParam == WM_MOUSEMOVE )
		{
			MOUSEHOOKSTRUCT *mst = (MOUSEHOOKSTRUCT*)lParam;
			ret = mst->pt;
		}
	
	return ::CallNextHookEx(g_hHookMouse, code, wParam, lParam);
}

DLLEXPORT BOOL IdleUIInit()
{
	if (g_hHookMouse == NULL) {
		HINSTANCE hInst = theDll.m_hInstance;
		g_hHookMouse = SetWindowsHookEx( WH_MOUSE, MouseProc, hInst,  0 );
	}
	ASSERT(g_hHookMouse);
	return TRUE;
}

DLLEXPORT void IdleUITerm()
{
	BOOL bRet = UnhookWindowsHookEx(g_hHookMouse);
	ASSERT(bRet);
}

Кусок приложения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
// .h файл
#define DLLIMPORT extern "C" __declspec(dllimport)

DLLIMPORT BOOL IdleUIInit();
DLLIMPORT void IdleUITerm();
DLLIMPORT POINT IdleUIGetLastInputTime();
//.cpp файл

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == - 1 )
		return - 1 ;
	SetTimer( 1 ,  100 , NULL);
	return  0 ;
}

void CMainFrame::OnPaint()
{
	CPaintDC dc(this);
	CString s;
	POINT ret = IdleUIGetLastInputTime();
		
	s.Format("Mouse x_coord = %i an y_coord = %i",ret.x, ret.y );
	CRect rc;
	GetClientRect(&rc);
	dc.DrawText(s, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}

void CMainFrame::OnTimer(UINT nIDEvent)
{
	Invalidate();						
	UpdateWindow();						
}
...
Рейтинг: 0 / 0
Отлов мышей
    #34256277
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очевидно, обработчик надо не на своё окно вешать.
...
Рейтинг: 0 / 0
Отлов мышей
    #34256531
_Rashid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, заработало :)
Сделал следующее:
Код: plaintext
g_hHookMouse = SetWindowsHookEx( WH_MOUSE, MouseProc, NULL,  0 );
вместо
Код: plaintext
g_hHookMouse = SetWindowsHookEx( WH_MOUSE, MouseProc, hInst,  0 );

maXmo , на сколько я понял, дескриптор библиотеки не нужно указывать из-за того, что ф-ции обработки и инсталяции ловушки находятся в одной и той же DLL?
...
Рейтинг: 0 / 0
Отлов мышей
    #34256676
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хз, не шарю, читал мсдн – не понял.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отлов мышей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]