Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sanya от Июнь 08, 2010, 17:13



Название: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: Sanya от Июнь 08, 2010, 17:13
Доброго времени суток!
Уперся в следующую проблему:

Код
C++ (Qt)
typedef void (*TYPEPROC)(char *);
 
class myApp :public QCoreApplication
{
public:
   myApp(int &argc, char**argv) :QCoreApplication(argc, argv) {};
 
   bool winEventFilter(MSG *message, long *result)
   {
           if (message->message == WM_SYSCOMMAND){
               if (message->wParam == 1037){
                   quit();
                   return true;
               }
           }
   };
 
};
 
int main(int argc, char *argv[])
{
   myApp app(argc, argv);
 
   TYPEPROC proc = 0;
 
   HMODULE hDLL=NULL;
   hDLL = LoadLibrary (L"liba.dll");
   if (!hDLL) return 0;
   proc = (TYPEPROC) GetProcAddress(hDLL,"proc");
 
 
   if (!proc){
       std::cout << "Error load function!";
   }
 
   proc("go");
 
   return app.exec();
 
}
 

После вызова liba::proc появляется некий интерфейс и после окончания своей работы присылает проге сообщение. Прога это сообщение не обрабатывает, т.е. вообще не попадает в winEventFilter после отработки app.exec().
Есть аналог кода на MSVC WinAPI и он работает, т.е. сообщение ловится.

Подскажите где может быть загвоздка, пожалуйста!


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: Sanya от Июнь 09, 2010, 08:36
Ну неужели никто с этим не сталкивался или просто никто не знает?


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: Авварон от Июнь 09, 2010, 09:15
писать на qt и юзать LoadLibrary... мдаа
в доке написано
Цитировать
It is only directly addressed messages that are filtered. To handle system wide messages, such as messages from a registered hot key, you need to install an event filter on the event dispatcher, which is returned from QAbstractEventDispatcher::instance().
может это ваш случай?


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: Sanya от Июнь 09, 2010, 09:20
По поводу LoadLibrary:
даю вам честное слово, что до этого там было QLibrary::load() вместо LoadLibrary.

QAbstractEventDispatcher::instance() - тоже стаил, не попадает он туда(в дебаге ставил брекпоинты).


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: SABROG от Июнь 09, 2010, 10:52
Может дело в том, что WM_*, то есть Windows Messages и ОС нужно хотябы одно окно для того, чтобы это сообщение послать.
Если это консольная программа, то собирается ли она с "CONFIG += console" или просто запускается из-под cmd?


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: Sanya от Июнь 09, 2010, 11:40
Да, я тоже думал в сторону без оконья. Но переопределив таким образом:
Код
C++ (Qt)
class myApp :public QApplication
{
public:
   myApp(int &argc, char**argv) :QApplication(argc, argv) {};
 
   bool winEventFilter(MSG *message, long *result)
   {
           if (message->message == WM_SYSCOMMAND){
               if (message->wParam == 1037){
                   doIt();
                   return true;
               }
           }
   };
int main(int argc, char *argv[])
{
   myApp a(argc, argv);
   ...
}
 
программа вообще сваливалась при запуске.
Пробывал

Код
C++ (Qt)
QAbstractEventDispatcher* m_EventDispatcher;
 
bool EventFilter(void* message){
   MSG *msg;
   msg = (MSG*)message;
   if (msg->message == WM_SYSCOMMAND){
       if (msg->wParam == 1037){
                   doIt();
           return true;
       }
   }
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   m_EventDispatcher = QAbstractEventDispatcher::instance();
   a.installEventFilter(m_EventDispatcher);
//    QCoreApplication::instance()->installEventFilter(m_EventDispatcher);
   m_EventDispatcher->setEventFilter((QAbstractEventDispatcher::EventFilter)EventFilter);
   ...
}
}
но опять же не помогло.
CONFIG   += console - стоит


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: kil89 от Июль 30, 2010, 17:58
наверное приложение умирает при старте потому что функция EventFilter должна возвращать ложь для удачно прошедших сообщений. проще говоря нужно в конце функции приписать return false;

иначе она их убивает и приложение не получает нужных для своей работы сообщений


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: SASA от Август 02, 2010, 10:12
Прога это сообщение не обрабатывает, т.е. вообще не попадает в winEventFilter после отработки app.exec().

Т.е. цикл разбора сообщений отработал и после этого сообщения не обрабатываются. Странно :)


Название: Re: отлов сообщения Windows WM_SYSCOMMAND.
Отправлено: sergek от Август 03, 2010, 12:30
После вызова liba::proc появляется некий интерфейс и после окончания своей работы присылает проге сообщение. Прога это сообщение не обрабатывает, т.е. вообще не попадает в winEventFilter после отработки app.exec().
Метод QApplication::exec() лишь запускает процесс обработки сообщений. Цикл обработки сообщений организуется обычно в виджете, а его нет. Поэтому программа после запуска процесса мирно заканчивается.
Можно попробовать обработать всю очередь сообщений QCoreApplication::processEvents.