Russian Qt Forum
Ноябрь 01, 2024, 22:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: отлов сообщения Windows WM_SYSCOMMAND.  (Прочитано 6717 раз)
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 и он работает, т.е. сообщение ловится.

Подскажите где может быть загвоздка, пожалуйста!
Записан
Sanya
Гость
« Ответ #1 : Июнь 09, 2010, 08:36 »

Ну неужели никто с этим не сталкивался или просто никто не знает?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Июнь 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().
может это ваш случай?
Записан
Sanya
Гость
« Ответ #3 : Июнь 09, 2010, 09:20 »

По поводу LoadLibrary:
даю вам честное слово, что до этого там было QLibrary::load() вместо LoadLibrary.

QAbstractEventDispatcher::instance() - тоже стаил, не попадает он туда(в дебаге ставил брекпоинты).
« Последнее редактирование: Июнь 09, 2010, 09:22 от Sanya » Записан
SABROG
Гость
« Ответ #4 : Июнь 09, 2010, 10:52 »

Может дело в том, что WM_*, то есть Windows Messages и ОС нужно хотябы одно окно для того, чтобы это сообщение послать.
Если это консольная программа, то собирается ли она с "CONFIG += console" или просто запускается из-под cmd?
Записан
Sanya
Гость
« Ответ #5 : Июнь 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 - стоит
Записан
kil89
Гость
« Ответ #6 : Июль 30, 2010, 17:58 »

наверное приложение умирает при старте потому что функция EventFilter должна возвращать ложь для удачно прошедших сообщений. проще говоря нужно в конце функции приписать return false;

иначе она их убивает и приложение не получает нужных для своей работы сообщений
« Последнее редактирование: Июль 30, 2010, 18:03 от Кирилл » Записан
SASA
Гость
« Ответ #7 : Август 02, 2010, 10:12 »

Прога это сообщение не обрабатывает, т.е. вообще не попадает в winEventFilter после отработки app.exec().

Т.е. цикл разбора сообщений отработал и после этого сообщения не обрабатываются. Странно Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #8 : Август 03, 2010, 12:30 »

После вызова liba::proc появляется некий интерфейс и после окончания своей работы присылает проге сообщение. Прога это сообщение не обрабатывает, т.е. вообще не попадает в winEventFilter после отработки app.exec().
Метод QApplication::exec() лишь запускает процесс обработки сообщений. Цикл обработки сообщений организуется обычно в виджете, а его нет. Поэтому программа после запуска процесса мирно заканчивается.
Можно попробовать обработать всю очередь сообщений QCoreApplication::processEvents.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.357 секунд. Запросов: 23.