Название: [РЕШЕНО] mouse_event застревает Отправлено: Alatey от Май 30, 2012, 18:09 Здравствуйте уважаемые форумчане :). У меня нетривиальный случай.
Пишу клиент-серверное приложение для удалённого управления рабочим столом. Эмулирую нажатие мыши с помощью mouse_event: Код: #include <windows.h> Хотел выкрутиться: вызывать "me(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);" из другого потока, чтобы основной поток не "зависал". Но так процедура не вызывается - выдаёт ошибку. Код: class DownMouseButtonThread : public QThread Название: Re: mouse_event застревает Отправлено: Bepec от Май 30, 2012, 18:28 Хм. Вроде я отписывался уже тут, однако сообщенька потерялась видимо.
Вопрос - зачем ты извращаясь подгружаешь user32dll??? Инклудь windows.h и не парься с функциями. Название: Re: mouse_event застревает Отправлено: Alatey от Май 30, 2012, 19:37 чё-то не пойму куда писать. И там - не там и там -не там .... В qt-форуме нет раздела Win32API.
Уже подключил: Код: #include <windows.h> И... блин... заработало (с моим потоком-выкрутасом) :) Весьма Вам благодарен "Bepec" !!!! :-* Название: Re: mouse_event застревает Отправлено: Bepec от Май 30, 2012, 19:40 В заголовке темы допиши [РЕШЕНО].
Всегда пожалуйста, за ваши деньги любой каприз ;) Название: Re: mouse_event застревает Отправлено: Alatey от Май 30, 2012, 20:13 Один раз заработало, а потом перестало, но это что-то с потоком.
Название: Re: mouse_event застревает Отправлено: Bepec от Май 30, 2012, 20:23 Сделайте простой пример потока. Который допустим будет надпись изменять.
И сделайте простой пример, который двигает мышкой. Без потока ;) И вот вы поймаете бага. Убейте бага. :D Название: Re: mouse_event застревает Отправлено: Alatey от Май 30, 2012, 23:21 Поток переписал, но приложение всё равно застревает.
Код: class DownMouseButtonThread : public QThread 1. нажатие на системную кнопку окна способно останавливает выполнение всех потоков приложения. Но не всегда (не могу пока уловить такие условия). 2. зажатие кнопки в потоке не отвисает, даже когда в главном потоке кнопка уже отжата. (что маловероятно) Вижу 2 выхода: 1. не использовать (скрыть) системные кнопки форм (свернуть, развернуть закрыть), в место них сделать соответствующие кнопки на самих формах. 2. перенести эмуляцию мыши в отдельное приложение, т.е. эмуляция мыши и интерфейс всегда должны быть в разных приложениях. Название: Re: mouse_event застревает Отправлено: Bepec от Май 31, 2012, 06:53 Кстати да, факт - windows при нажатии на системные кнопки окна, тормозит GUI приложения. Потоки же в это время вроде не тормозятся.
Счас проверю :) Потоки не тормозятся. Но если у тебя он работает синхронно с основным потоком, тогда да - капец до отжатия кнопачки :D Название: Re: mouse_event застревает Отправлено: Alatey от Май 31, 2012, 17:01 Сделал зажимание и отпускание в одном неосновном потоке - застревает :o.
Мне кажется что при клике блокируется поток который "издаёт" клик, и тот поток который его принимает (основной). Т.е. эмуляция зажатия и отжатия должно происходить в разных потоках, при том не являющихся основными. Буду проверять эту версию. ПС: Интересная закономерность: если время между зажатием и отпусканием относительно маленькое, то не застревает ;D. Название: Re: mouse_event застревает Отправлено: Bepec от Май 31, 2012, 18:04 Я те по секрету скажу. Наверно у тебя где то потоки связаны. И основной поток блокирует дополнительный. Вот тебе и весь сказ, а не глюк.
Название: Re: mouse_event застревает Отправлено: Alatey от Май 31, 2012, 19:49 да, вероятно так и есть, в главном потоке сокет принимает команды из сети. Теперь нужно перенести сокет в другой поток.
Проблема решена! mouse_event всегда вызываю из одного неглавного потока. ПС: меня запутало то, что команды эмуляции приходили через сокет, который блокировался в главном потоке и команда отпускания миши не поступала. Поэтому сокет теперь выполняется в неглавном потоке. Верес был прав ;D |