Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

передвижение мыши!

52K
08 декабря 2009 года
KRIK
16 / / 08.12.2009
Ребята, задача в том чтобы постоянно следить за передвижением мыши!
столкнулся с двумя проблемами!
1. использовал функцию API GetCursorPos (&c) в зацикленом While с небольшой задержкой (больше делать задержку не приемлемо), получилось чересчур расточительно по ресурсам ЦП под 100% все остальное лагать начало!

2. ето в принципе решил! GetCursorPos (&c) снимает положения курсора, а когда курсор доходит до края екрана слежение останавливается! но эту проблему решил, на экране с каждого края отступил по 10 пикселей и когда курсор вылазит за эти границы перемещал курсор SetCursorPos-ом в центр и продолжал слежение!
я с апи раньше не работал!

потом подсказали SetCapture начало работать но не так как мне нужно, положение передавалось только когда курсор над окном программы, а мне нужно когда программа свернута, какбы обработчик кнопки "Старт" и пошло отслеживание и передача в мои переменные с последующей обработкой!

пользуюсь вижуал 2008.
вот код (в нете нашел почистил от лишнего) отвечает за снятие показаний и запись в файл! но нет как надо и недопонимаю зачем в функции Hello if и while?


[HTML]#include <windows.h>
#include <stdio.h>
void AddSegmentAtMessagePos( HDC hDC, HWND hwnd, BOOL bDraw )
{
int a, b;
DWORD dwPos;
POINTS points;
POINT point;
dwPos = GetMessagePos();
points = MAKEPOINTS( dwPos );

point.x = points.x;
point.y = points.y;


a= points.x;
b= points.y;


FILE *f;
f =fopen ("c:\\main.txt", "a");
fprintf (f,"%i %i\n", a, b);
}

void Hello( HWND hwnd )
{
if ( GetCapture() != NULL )
return; HDC hDC = GetDC( hwnd );
if ( hDC != NULL )
{
SetCapture( hwnd );
AddSegmentAtMessagePos( hDC, hwnd, FALSE );
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
if ( GetCapture() != hwnd )
break;
switch ( msg.message )
{
case WM_MOUSEMOVE :
AddSegmentAtMessagePos( hDC, hwnd, TRUE );
break;
case WM_LBUTTONUP:
goto ExitLoop;
default:
DispatchMessage( &msg );
}
}
ExitLoop: ReleaseCapture();
ReleaseDC( hwnd, hDC );
}
}



LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{ switch( uMsg )
{ case WM_MOUSEMOVE: Hello( hwnd );
break;
case WM_DESTROY : PostQuitMessage( 0 );
break;
default : return DefWindowProc( hwnd, uMsg, wParam, lParam );
} return 0;
}




int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR d3, int nCmdShow )
{
if ( hPrevInstance == NULL )
{ WNDCLASS wndClass;
memset( &wndClass, 0, sizeof( wndClass ) );
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.hInstance = hInstance;
wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndClass.lpszClassName = "HELLO";
if ( !RegisterClass( &wndClass ) )
return FALSE;
}
HWND hwnd;
hwnd = CreateWindow( "HELLO", "HELLO", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
MSG msg;
while ( GetMessage( &msg, NULL, 0, 0 ) )
DispatchMessage( &msg );
return msg.wParam;
} [/HTML]
87
08 декабря 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: KRIK
1. использовал функцию API GetCursorPos (&c) в зацикленом While с небольшой задержкой (больше делать задержку не приемлемо), получилось чересчур расточительно по ресурсам ЦП под 100% все остальное лагать начало!



Посмотри в сторону потоков.

52K
09 декабря 2009 года
KRIK
16 / / 08.12.2009
А в коде что поменять чтобы получало данные постоянно?
399
09 декабря 2009 года
KIV
432 / / 20.01.2009
А если использовать SetWindowsHookEx. Тогда процедура будет вызываться только когда мышь переместили. Я писал нечто подобное - процессор почти не жрёт.
52K
23 января 2010 года
KRIK
16 / / 08.12.2009
есть готовый пример куков(СИСТЕМНЫХ ЛОВУШЕК) в C++Builder 6! все работает нормально!
но Builder не работает то что я раньше делал, и то что я умею!
там в примере длл и сама программа которая ее вызывает!
кто может помоч перевести с Builder в Visual Studio?
439
27 января 2010 года
Rexulnik
217 / / 09.02.2005
Цитата: KRIK
есть готовый пример куков(СИСТЕМНЫХ ЛОВУШЕК) в C++Builder 6! все работает нормально!
но Builder не работает то что я раньше делал, и то что я умею!
там в примере длл и сама программа которая ее вызывает!
кто может помоч перевести с Builder в Visual Studio?



для Хуков надо делать свою DLL-ку, и в проге сишной её грузить...
так кстати можно отслеживать и клавиатурные нажатия, и вроде как на другие устройства тоже вешать...
кстати ещё можно позицию мыши ловить когда на твоём окне кнопка зажата, но не отпущена, типа для drag & drop, но когда мышь отпускается слежение останавливается)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог