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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: ошибка в методе "nativeEvent" / C++ и WinAPI  (Прочитано 3619 раз)
virtus
Гость
« : Март 10, 2014, 08:46 »

Здравствуйте,
хочу послать пользовательское межпроцессное сообщение. Для этого в дочернем процессе переопределяю метод - nativeEvent()

in .h

Код:
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void on_pushButtonWriteFile_clicked();
 
private:
    Ui::MainWindow *ui;
 
protected:
    virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result);
 
};

Реализация метода nativeEvent()
in .cpp

Код:
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    UINT MyMessage = RegisterWindowMessage(L"MY_MESSAGE");
    UINT msg = *(reinterpret_cast<UINT*>(message));
    if(msg == MyMessage)
    {
        *result = 0;
        MessageBox(0, L"Got", L"MyMessage", MB_OK);
        return true;
    }
}

В итоге процесс запускается, но он зависший. Почему тут ошибка?

Спасибо.
Записан
Serr500
Гость
« Ответ #1 : Март 10, 2014, 09:31 »

В итоге процесс запускается, но он зависший. Почему тут ошибка?
Не вижу, где он запускается. Выложите минимально компилируемый пример.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Март 10, 2014, 09:38 »

Попробуйте вызывать nativeEvent родительского класса, или хотя бы возвращать осмысленные значения.
Записан
virtus
Гость
« Ответ #3 : Март 10, 2014, 09:59 »

Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

header:

private slots:
    void on_pushButtonWriteFile_clicked();

private:
    Ui::MainWindow *ui;
/*
protected:
    virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result);
*/
};

#endif // MAINWINDOW_H

Implemention:

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QMessageBox"
#include <windows.h>
#include <iostream>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButtonWriteFile_clicked()
{
    std::cout << ui->lineEdit->text().toUtf8().data();
}

/*
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    UINT msg1 = RegisterWindowMessage(L"User message");
    UINT msg2 = RegisterWindowMessage(L"WMdata");
    MSG* msg = static_cast<MSG*>(message);
    if(msg1 == msg->message)
    {
        MessageBox(0, L"Got", L"User message recivied.", MB_OK);
        result = 0;
        return true;
    }
}
*/

Когда это метод закомментирован, то процесс запускается.
А если раскомментировать, то нет.
А этот метод должен из конкретного места вызываться?
Этот код у меня для дочернего процесса.
Записан
virtus
Гость
« Ответ #4 : Март 10, 2014, 10:01 »

Все разобрался. Нужно было написать ещё return false. Тогда процесс запускается не зависшим. Всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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