Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2010, 19:09   #1
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию События мышки

В атаче код реализиющий определение событий мышки без перехвата сообщений. Проблема в событии движения мышки.

в классе L_MouseEvent, в потоке DWORD WINAPI MouseMove(LPVOID lparam) происходит проверка изменений координат мышки. Сравниваеться текущая позиция мышки с последней, которая была, и если они не равны, то мышка передвинулась. Дело в том, что если мышку вести очень медленно, то событие не возникает.

Код:
DWORD WINAPI MouseMove(LPVOID lparam)
{
	L_MouseEvent * mouse = (L_MouseEvent*)lparam;
	POINT last,now;//last - последняя позиция мыши, now - текущая
	GetCursorPos(&last); 
	while (1)
	{
		GetCursorPos(&now);

		if ( (now.x != last.x & now.y != last.y) )
		{
			if (mouse->OnMouseMove)
			{
				mouse->OnMouseMove(now.x,now.y);
			}
		}

		last = now;
		Sleep(1);
	}
	return 0;
}
Classes.rar
подпись
liljon вне форума Ответить с цитированием
Старый 23.04.2010, 19:47   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
if ( (now.x != last.x & now.y != last.y) )
это во-первых.
во-вторых, так никто не делает. лучше использовать хуки
но если решил оставить так, то пофиксь первый баг, и last = now; помести под ветку выполнения условия
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 23.04.2010 в 19:50.
pproger вне форума Ответить с цитированием
Старый 23.04.2010, 20:41   #3
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
это во-первых.
во-вторых, так никто не делает. лучше использовать хуки
но если решил оставить так, то пофиксь первый баг, и last = now; помести под ветку выполнения условия
Объясните пожалуйста почему "так" никто не делает? Если использовать хуки , то как из чужого процесса я вызову функцию из своего?

Спасибо. я постоянно путаюсь в операторах & и | Сразу об этом как то не подумал =\
подпись

Последний раз редактировалось liljon; 23.04.2010 в 20:59.
liljon вне форума Ответить с цитированием
Старый 24.04.2010, 00:01   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2liljon
Цитата:
Объясните пожалуйста почему "так" никто не делает?
хотя бы потому, что получать уведомление проще, чем следить (кстати, не только в программировании).

Цитата:
Если использовать хуки , то как из чужого процесса я вызову функцию из своего?
из какого "чужого"?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 24.04.2010, 01:23   #5
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
из какого "чужого"?
////////////////

Цитата:
Основной проблемой здесь является адресное пространство. Когда глобальная DLL исполняется, она исполняется в контексте того процесса, чье событие перехватывается. Это означает, что адреса, которые видит DLL, даже для своих собственных переменных, являются адресами в контексте целевого процесса. Поскольку это DLL, она имеет отдельную копию своих данных для каждого использующего ее процесса. И это означает, что любые значения, которые вы устанавливаете в глобальных для DLL переменных (таких, как объявленные на уровне файла), являются приватными и не будут наследовать ничего из исходного контекста библиотеки. Они будут инициализироваться заново, т.е., обычно, они будут равны нулю.
К тому же представте как отлаживать пришлось бы исходный код в 100 кб, запиханый в библиотеку. Именно так я начинал делать сначала.

Цитата:
Сообщение от pproger Посмотреть сообщение
хотя бы потому, что получать уведомление проще, чем следить (кстати, не только в программировании).
Функция GetMessage именно это и делает, например. С той лишь разницей, что я описал это все на более низком уровне.
подпись

Последний раз редактировалось liljon; 24.04.2010 в 01:34.
liljon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват события нажатия мышки в любой области экрана _Zergatul Win Api 10 06.07.2009 16:29
2 курсорчика мышки Zeraim Общие вопросы Delphi 9 04.04.2009 00:45
Как генерировать события от мышки? Serejka Общие вопросы Delphi 5 01.11.2008 13:48
Отключение мышки Yuran Win Api 2 23.06.2008 13:08
колЁсико мышки Experementator Общие вопросы Delphi 3 05.05.2008 16:31