Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > WinAPI и мышь


Автор: AGENTxXx 7.12.2009, 19:20
Добрый день! У меня есть очень хорошая идея и я бы хотел реализовать ее. Рассказать не могу, так как хочу попробывать написать ПО и полную версию потом сделать условно бесплатной. Всем кто поможет и если у меня все получится, в долгу не останусь (все получится - реализовать условно бесп. прогу). А пока есть ли знающие люди которые бы мне помогли разобраться с такой проблемой:
Нужно записывать координаты мыши (с указанием промежутка записи желательно). А потом их воспроизвести. то есть чтобы мышка сама бегала. В общем не чего сложного, писал в начале на делфи, но в файл записывался так, что в начале и в конце бинарные символы появлялись и мой массив считывания ругался на не правильный формат. Если еще не сложно то напишите WinAPI функции реагирования мыши (если слишком уж прошу то сам найду). Хотел бы написать на C+ или на C# (чтот не нашел где по C# вопросы задавать или он к дота Net отнесен тут). Ребят, поможите чем можите))) Я знаю что тут программеры просто супер))) Уже помогали. Я просто с делфи нормально дружу а вот с Си не очень (так как в универе его изучал а там быстро быстро и причем языков 5 и все одновременно в итоге не чего толком не запомнил). Жду вашей помощи!

Автор: bra1ny 7.12.2009, 21:58
я бы через драйвер фильтр сделал бы. 
если интересно то читайте вот это , http://www.wasm.ru/article.php?article=drvw2k16 ( в статье описано для ps/2.)

Автор: AGENTxXx 7.12.2009, 22:39
Статейку посмотрел. На самом деле считаю что она интересная, но мне надо бы чтобы было на C++ или си шарп. Я сразу говорю: что я начинающий в си, а асемблер я вообще только на самом начальном уровне знаю. Там слишком сложно для меня написано. Ребят, мне нужно просто помочь пока что реализовать чтобы данные мыши считывались, потом их можно было записать в файл и воспроизвести чтобы движения повторились. Для опытных это совсем просто. Я и говорю что на делфи написал но с глюками, но хотелось бы на с++ или шарп. Ребят, помогите пожалуйста. Если что, дак это не какая проверочная, ни курсовой ни диплом... Это моя идея и я хочу ее полностью реализовать. Ну да, ну чайник я в командах с++, что не совсем сказать что в WinAPI. плиз!!! Тут ведь самые кульные прогеры!!! 

Автор: bra1ny 7.12.2009, 23:20
ну юзайте тогда GetCursorPos() потом SetCursorPos() .
в msdn все написано между прочим http://msdn.microsoft.com/en-us/library/ms648380%28VS.85%29.aspx . 

Автор: mekhanikus 8.12.2009, 15:15
Может покурить в сторону WH_MOUSE Hook?

Автор: smoke_man 8.12.2009, 15:25
Посмотри http://www.codeproject.com/KB/applications/winmacro.aspx

Автор: TGrey 8.12.2009, 18:24
Да я уже недавно пробовал реализовать подобное в учебных целях. Вывод напросился один.
Просто для имитации событий мыши используем mouse_event()(лучше ничего не нашел).
А если нужна глобальная запись событий. Тогда создаем дллку в нее пихаем глобальный хук мыши записываем и воспроизводим тем же mouse_event(). Дллку нужно создавать потому что только через ДЛЛ работает глобальный хук.

WH_MOUSE => record data => mouse_event

вся структура(простейшая).

Автор: AGENTxXx 8.12.2009, 19:30
Хорошо, попробуем чуть иначе: мне сейчас главное реализовать работу с файлом. Думаю что как считать координаты эт я смогу. Задача которая меня затруднила в делфи: реализовать запись всех координат в мемо и последующие их сохранение без бинарной вскавки перед и после этого текста, а потом из файла обратно в мемо. Думаю многие делали например вот такое чудо: из массива данные отправляются на мемо, потом они сохраняются, а потом они считываются обратно. Кто нить может код написать? Мемо нужно для того чтобы это было хорошо для отладки

Автор: smoke_man 8.12.2009, 20:03
Если использывать билдер и текстовый файл, то:
Memo1->Lines->SaveToFile()
и
Memo1->Lines->LoadFromFile()

Автор: AGENTxXx 8.12.2009, 23:08
Спасибо, попробую. С билдером с++ не дружил еще, но билдер делфи меня радует. Большой плюс: скорость работы выше, а то визуал так тормозить любит))) Как попробую, отпишусь

Автор: TGrey 9.12.2009, 19:17
А почему не сохранять структурой?
struct Data
{
     int x;
     int y;
     int action;
};

вот пользователь водит мышой, а глобальный хук пишет в структуру нужные действия.
К примеру на клик Data d{x,y, CLICK}; и писать в файл структуру write((char*)&d, sizeof(Data));(fstream)
На движение Data d{x,y, MOVE}; и т.п. 
После чего при воспроизведении пускать цикл до конца файла и читать в туже структуре после чего сразу брать с нее данные и пихать в mouse_event().

Автор: AGENTxXx 9.12.2009, 22:00
Структуру и подобное не хочу использовать потому что для отладки работать с мемо удобнее. Я согласен, что структуру более рационально использовать. Просто сейчас моя задача: сделать так чтоб любым способор работало. А про оптимизацию буду в будующем думать. Скажите: зачем делать 2 дела если можно сделать одно и оптимизированное. Отвечаю: так как я еще не спец в этих(м) языке, то стараюсь делать как могу, а не как рационально)))

Автор: TGrey 9.12.2009, 22:57
Ну тогда, Удачи)

Автор: AGENTxXx 13.12.2009, 20:39
Натолкнулся на проблему и не знаю как ее решить. Проблема такая: немогу поймать события мыши. Координаты мыши уже ловлю, а вот события нет((( Понимаю что вроде как WH_MOUSE - дельная вещь, но вот как с ней работать не очень и разобрался.... Может кто ни будь напишет как например ловить нажатие левой кнопки мыши? На счет как программно реализовать нажатие эту информацию я нашел. Жду скорого ответа ну или совета.. ну или уж ссыклку))) Заранее благодарен!

Автор: smoke_man 13.12.2009, 21:11
Посмотри http://forum.vingrad.ru/topic-141757.html

Автор: AGENTxXx 13.12.2009, 21:49
Посмотрел, но у меня не чего не получилось из этого. Вот мой код:
Код

LRESULT CALLBACK SecondWinProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch ( message )
    {
        case WM_LBUTTONDOWN:
        case WM_RBUTTONDOWN:
          MessageBeep( -1 );
          break;
        /* ... */
    }
}


void tatata (VOID)
{

     UINT message;
     POINT pc;
     while (true){
     GetCursorPos(&pc);
     message=SecondWinProc(Form1,0,0,0);
     Form1->Memo1->Lines->Add((AnsiString)pc.x+" "+(AnsiString)pc.y+" "+message);
     Sleep(100);}
}

void twotread ()
{
    DWORD  dwThrdParam = 1;
    DWORD IDThread;
    long gtr;
    HANDLE hThread;
    char szMsg[80];
    hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) tatata,NULL,0,&IDThread);

    if (hThread == NULL)

{
      wsprintf( szMsg, "CreateThread failed." );
      MessageBox( NULL, szMsg, "main", MB_OK );
   }
   else
   {
      _getch();
      CloseHandle( hThread );
   }


}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
     twotread();
}

Место где должно выхождить сообщение находится в процедуре: tatata. Понимаю что тут что то не так написанно. Помогите исправить чтобы было правтильно!

Автор: smoke_man 13.12.2009, 21:52
ты на билдере пишешь?

Добавлено через 8 минут и 48 секунд
А если работать с OnMouseDown или OnMouseUp?

Автор: AGENTxXx 13.12.2009, 22:25
Решил на билдаре, так как этот бобер визуал не захотел понимаети ли работать с кодом:
Код

POINT pc;
GetCursorPos(&pc);

Выдовал ошибку и все. Пришлось билдер попробывать, и он не отказал в работе. Почему не через эти события? Ответ такой: события у меня в программе должны ловиться глобально, т.е. не только на данной форме, а эти события привязаны ведь к текущей форме. Так что я и хочу их поймать через WanAPI ну или через то, что ловит их глобально, но чет не получается ни чего...

Автор: smoke_man 13.12.2009, 22:42
Так у других форм можно просто указать обработчки мыши формы 1.

Добавлено через 8 минут и 43 секунды
А если использовать в качестве обработчика свою WndProc, то можно используя http://forum.vingrad.ru/forum/topic-276866.html пример.

Автор: AGENTxXx 13.12.2009, 22:51
Ну каким образом например ты укажешь обработчик рабочего стола например. Я понимаю ты подумал что в программе несколько форм и на них должны выполнятся какие то действия? Нет, это не так, у программы будет только 1 форма с мемо в которой будет записываться все действия. РЕБЯТ! Ну не уж то не кто не писал подобные проги то? Помогите пожалуйста!!!

Автор: smoke_man 13.12.2009, 23:03
Так используй хуки - в этом топике давались примеры работы с обработкой мыши и сохранением координат в файл с последующем их чтением.

Автор: AGENTxXx 13.12.2009, 23:07
Дак вот я и пытаюсь разбираться с хуками. Дак не получается. Сейчас вот написал из данного топика TGreyю вроде, чтобы пояснил как с ними работать. Да гуглю вот еще. Просто везде пофессиональном языком написанно, а мне бы все же хотелось понятным чтобы было. А то если тупо скопировать код, то я ж не пойму как это все происходит и в итоге быстро забуду. Может хотя бы кто ни будь книгу знает где хорошо это описанно?

Автор: SVN74 13.12.2009, 23:09
Цитата(AGENTxXx @  7.12.2009,  19:20 Найти цитируемый пост)
Нужно записывать координаты мыши (с указанием промежутка записи желательно). А потом их воспроизвести. то есть чтобы мышка сама бегала.

Раз уж вы писали на Дельфи, то берите  в руки C++ Builder,  так будет для вас проще на "первый раз".
----------------
По теме:
Если вам надо записывать параметры мыши в пределах работы вашего приложения, то нет ничего проще , чем использовать сами события главной формы приложения, если же надо записывать движения мыши на всем экране, то тут лучше использовать WIN API...
Можно сделать к примеру так, - кинуть на форму таймер и в свойствах (его) выставить нужный вам интервал записи в файл,  далее в обработчике таймера записывать в файл функциями  CreateFile, WriteFile,  -  структуру (определенную в пределах класса главной формы) , при этом параметры в структуре будут меняться событиями мыши главной формы а таймер через определенное время будет записывать структуру в файл. 
Таким же способом можно считывать из файла таймером, и  считанные параметры применять создав для них свои события...  

Автор: AGENTxXx 13.12.2009, 23:28
SVN74 - Спасибо, но с этой проблемой я пока что справился. Сейчас проблема в следующем: Как перехватить нажалие клавишь мыши? Как их эмулировать я знаю. То есть нужно: при нажатой левой например кнопки мыши вывести: нажата левая кнопка мыши и все выводить пока не будет она отпущена, а когда отпущена то вывести: левая кнопка отпущена. Сможешь объяснить реализацию понятным языком?

Автор: SVN74 13.12.2009, 23:42
Тогда найдите литературу - (А.Я. Архангельский - Приемы программирования С++ Builder 6 и 2006 "Механизмы Windows, сети"), там есть все что вам надо...

Автор: AGENTxXx 14.12.2009, 00:25
Не могу пока найти этот учебник. Надеюсь в ближайшее время найти получится

Автор: xvr 14.12.2009, 16:51
Вот это Form1->Memo1->Lines->Add звать из отдельного thread'а нельзя - не расчитанна VCL на работу из сторонних thread'ов. Пользуйтесь TThread и методом Synchronize, или зовите ваш код по таймеру (это кстати будет правильнее)


Автор: AGENTxXx 14.12.2009, 19:34
Все тут профы то профы а вот нормально объяснить не хотят. Повторяю: у меня на курсе было много языков, в итоге не один толком не запомнил. Поэтому и пишу как получается а не как правильно. Я ж можно сказать только изучать начал с++. Только смотрю с событиями мыши не кто не работал... Такая вещь интересная а вы.....

Автор: GremlinProg 14.12.2009, 20:16
AGENTxXx, надо наверное приложить немного усилий: почитать литературу, поискать готовые решения,
поизучать их немного, если хочешь сделать что-то реально полезное

самое главное - поискать

по хукам информации на самом деле даже больше чем требуется,
а просто исчерпывающий пример на все типы хуков дан в MSDN, и уже неоднократно прилагался
(вот везде бы так расписывали, цены б ему небыло)
помимо теории есть конкретные примеры на форуме

если что-то не работает - пиши, темы ведь открыты
если не понимаешь принципы - почитай теорию, литературу уже предлагали

не хочешь сам вникать - это могут сделать другие, просто это уже вопрос бюджета для фрилансеров,

хотя, если честно, все уже давно написано,
так что если решишь платить, то будешь это делать исключительно за то,
что не хочешь сам вникать в задачу, а не за саму задачу

Автор: GremlinProg 14.12.2009, 21:27
Цитата(AGENTxXx @  14.12.2009,  22:49 Найти цитируемый пост)
есть такая процедура MouseProc с помощью которой можно узнать, а ее на самом деле даже и не существует

изучи вот http://msdn.microsoft.com/en-us/library/ms644960(VS.85).aspx пример и не возвращайся, пока не поймешь, почему не нужно искать MouseProc

а http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx - краткое описание всех хуков
детализация описания по каждому хуку лежит в соответствующих описаниях колбэков (callback)

изучить - значит исследовать, т.е. скопировать пример, вставить в свою среду разработки (с подсветкой или без - как удобно), например VS, найти зависимости между всеми функциями, разбить весь код на функциональные блоки (я сам очень часто это делаю: вставляю пустую строку с комментарием между разнородными участками кода так, чтобы не осталось ни одной неклассифицированной строки кода) и написать к каждому такому блоку комментарий своими словами, что он делает (это можно проследить по документации к колбэкам, т.к. ничего за пределами этой документации там не делается)

вот после этого можно говорить, что вопрос изучил, но ничего не понял

Автор: AGENTxXx 14.12.2009, 21:38
Я думаю ты уже мне не поверишь: вставлял я этот описанный код, а прога не захотела компиллироваться (хотя может это конечно потому что я на билдере писал а не на визуал). Я буду очень благодарен если ты хотя бы напишешь какой оттуда нужно код вставить чтобы он откомпилировался. А то я сомневаюсь что без компиляции смогу разобраться что какая строчка выполняет. И напиши на чем тестишь. Вот запустится если, то буду ломать мозги и разбираться. Кстате, я был уже и тут. Смотрел, но не чего толкового не понял... И не надо только говорить что я ленивый или еще чего.... Все проги сам пишу, спрашиваю помощь редко. На этом форуме ито всего от меня 2 темы. Тем более 2 тема про си шарп вопрос был о многопоточности

Автор: bra1ny 14.12.2009, 23:30
Цитата

Я думаю ты уже мне не поверишь: вставлял я этот описанный код, а прога не захотела компиллироваться

Ну тут же не телепаты , что за ошибка ?

Автор: GremlinProg 14.12.2009, 23:35
Цитата(AGENTxXx @  14.12.2009,  23:38 Найти цитируемый пост)
Вот запустится если, то буду ломать мозги и разбираться.

Цитата(AGENTxXx @  14.12.2009,  23:38 Найти цитируемый пост)
И не надо только говорить что я ленивый или еще чего....

именно об этом я и писал,
странная у тебя позиция: не могу запустить - значит не работает, а не работает, значит и разбираться не буду

примеры из MSDN по большей части не для того чтобы запускать, а для того, чтобы их разбирать,
эти примеры сжаты до такой степени, чтобы вмещали только суть вопроса,
в этом-то они и полезны, т.к. точно знаешь, что лишнего там ничего нет,
и не потеряешь время, если хоть чуть-чуть таки голову поломаешь

в приложении рабочий проект для VS8 для http://msdn.microsoft.com/en-us/library/ms644960(VS.85).aspx примера,
минимальные изменения сделаны исходя из моих личных предпочтений,
т.е., в принципе, можно было вообще не менять ничего,
но раз ты не захотел разбираться с кодом из MSDN - разбирайся с моими предпочтениями )

Автор: AGENTxXx 25.1.2010, 00:24
Извинияюсь что долго не было меня. Большое спасибо за помощь GremlinProg! Но все же, я для себя решил что начну ка я C# лучше изучать. Так как книги знаю хорошие для него, да и попроще он (в моем понимании). Осталось только его многоплатформенным сделать! С хуками прогу нашел, сейчас вот разбираюсь. Пока мало что понятно (текст то весь ясен а вот всякое выёживание не очень. Да и вообще: СПАСИБО ВСЕМ КТО ПРИНИМАЛ УЧАСТИЕ В ЭТОЙ ТЕМЕ! Всем удачной разработки ПО))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)