Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отлов мышей / 4 сообщений из 4, страница 1 из 1
15.01.2007, 12:56
    #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
15.01.2007, 16:13
    #34256277
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отлов мышей
очевидно, обработчик надо не на своё окно вешать.
...
Рейтинг: 0 / 0
15.01.2007, 17:15
    #34256531
_Rashid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отлов мышей
Действительно, заработало :)
Сделал следующее:
Код: plaintext
g_hHookMouse = SetWindowsHookEx( WH_MOUSE, MouseProc, NULL,  0 );
вместо
Код: plaintext
g_hHookMouse = SetWindowsHookEx( WH_MOUSE, MouseProc, hInst,  0 );

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


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