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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Блокировка экрана  (Прочитано 17924 раз)
virtual_root
Гость
« Ответ #15 : Июль 06, 2012, 11:26 »

Спасибо! Я попробовала ловить сообщения, вроде что-то приходит. ну я не знаю как этот ответ разобрать и достать от туда wParam... И ещё моё приложение зависает после прихода сообщения...  функцию родителя winevent(MSG,long) вроде вызвала, ну приложение висит... Подскажите, пожалуйста, что я не так сделала?Непонимающий
Вот код:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <Windows.h>
#include <wtsapi32.h>
#include <winbase.h>
#include <winuser.h>
#include <ws2spi.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    static MainWindow* instance();
    ~MainWindow();
protected:
    bool winEvent(MSG *message, long *result);
    
private:
    explicit MainWindow(QWidget *parent = 0);
    Ui::MainWindow *ui;
    typedef bool (*MyPrototype2)(HWND,DWORD);
    MyPrototype2 WTSRegisterSessionNotification;
protected slots:
  
};

#endif // MAINWINDOW_H


файл .cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"


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

    QLibrary myLib("wtsapi32");

        myLib.load();
        myLib.loadHints();

        if (!myLib.isLoaded())
            exit(0);

        QLibrary myLib2("user32");

            myLib2.load();
            myLib2.loadHints();

            if (!myLib2.isLoaded())
                exit(0);

         WTSRegisterSessionNotification = (MyPrototype2) myLib.resolve("WTSRegisterSessionNotification");
         if (!WTSRegisterSessionNotification)
                 exit(0);
         else WTSRegisterSessionNotification(MainWindow::winId(),0);  // регестрируем наше окно на получение сообщения. Здесь всё правильно?

         typedef BOOL (*MyPrototype)();
         MyPrototype myFunction = (MyPrototype) myLib2.resolve("LockWorkStation"); // фун-я блокировки экрана
         if (!myFunction()) qDebug()<<"!!!!";  // вызываю блокировку экрана

  
 }

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


MainWindow* MainWindow::instance(){
    static MainWindow* MainWindowPTR = new MainWindow();
    return MainWindowPTR;
}

bool MainWindow::winEvent(MSG *message, long *result){
    qDebug()<<message<<"\n"<<result;    // как мне вытащить здесь wParam ???
    this->winEvent(message,result);
}

Может я неправильно вызываю функцию родителя?
« Последнее редактирование: Июль 06, 2012, 11:30 от virtual_root » Записан
virtual_root
Гость
« Ответ #16 : Июль 06, 2012, 11:38 »

Мне кажется что эта фун-я WTSRegisterSessionNotification  мне бесконечно много шлёт сообщений и поэтому моя программа зависает, а при вызове родительской фун-и WinEvent вообще падает. Я точно что-то не так сделала... Мне нужно получать сообщения о блокировки,разблокировки экрана всё время пока моя программа работает. Подскажите, пожалуйста, что я не так пишу в коде? Может где-то надо добавить фун-ю
Код:

LRESULT CALLBACK WindowProc(
  HWND hWnd,       // handle to window
  UINT Msg,        // WM_WTSSESSION_CHANGE
  WPARAM wParam,   // session state change event
  LPARAM lParam    // session ID
);
И где-то её связать с сообщениями?
Записан
Bepec
Гость
« Ответ #17 : Июль 06, 2012, 11:56 »

Вы действительно не понимаете что делаете?

Помоему вам лучше почитать про winApi, С++ и программирование. Многое почерпнёте.

Код:
bool MainWindow::winEvent(MSG *message, long *result){
    qDebug()<<message<<"\n"<<result;    // как мне вытащить здесь wParam ???
    this->winEvent(message,result);
}

На пальцах - по другому вы не поймете, помоему (как низко я вас оценил однако Оо):

Первое же сообщение виндовс, попав в эту функцию, выдаёт в кудебаг строчечку и вызывает эту же функцию с собой же, что в свою очередь вызывает эту же функцию с собой же и эта же вызванная функция вызывает себя же с собой же, и -//- -//-  и так до тех пор, пока вы не закроете программу.

Этот метод winEvent. Он ПОКАЗЫВАЕТ вам сообщения, пришедшие вашему окну. И посмотрите на тип функции - bool. Вот что она должна возвращать, а не вызывать себя 100500 раз до посинения.
Записан
Serr500
Гость
« Ответ #18 : Июль 06, 2012, 12:11 »

1) Не this->winEvent, а QMainWindow::winEvent.
2) wParam получается так: message->wParam

И поймите, наконец, что WTSRegisterSessionNotification НИКОМУ НИЧЕГО НЕ ШЛЁТ! Она ПОДПИСЫВАЕТ окно на сообщения.
« Последнее редактирование: Июль 06, 2012, 12:16 от Serr500 » Записан
Serr500
Гость
« Ответ #19 : Июль 06, 2012, 12:25 »

Вот Вам минимальный проект, который показывает, как работать с этими сообщениями. Сделал "на коленке" за 5 минут.
Записан
virtual_root
Гость
« Ответ #20 : Июль 06, 2012, 12:37 »

Спасибо вам большое ребята! У вас большой опыт, я уже второй день с этим вожусь...
Я извиняюсь, что задаю глупые вопросы, порой я действительно не понимаю как делать.. Я только пол года программирую, опыта нет, а обратиться больше не к кому, как не к googly и на форумы.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #21 : Июль 06, 2012, 12:48 »

Спасибо вам большое ребята! У вас большой опыт, я уже второй день с этим вожусь...
Я извиняюсь, что задаю глупые вопросы, порой я действительно не понимаю как делать.. Я только пол года программирую, опыта нет, а обратиться больше не к кому, как не к googly и на форумы.

Вы ничему не научитесь, если не будут писать много кода и внимательно читать документацию от корки до корки. В данной теме вы ТРИЖДЫ писали код, который полностью противоречит документации.
Записан
virtual_root
Гость
« Ответ #22 : Июль 06, 2012, 12:50 »

Да-да, пишу пишу каждый день упражняюсь и документацию читаю, только она на английском и походу я не всегда её правильно понимаю) У меня всё получилось!!! Спасибо всем!!!! Улыбающийся
Записан
virtual_root
Гость
« Ответ #23 : Июль 06, 2012, 12:58 »

У меня тут ещё один вопросик... а можно ли этот код вынести в отдельный поток?  Меня затрудняет получение дескриптора окна и обработка сообщений, ведь класс будет наследоваться от QThread. Или это в принципе нельзя засунуть в поток?
И ещё один вопросик. а если я этот проект как службу буду делать, то тогда придется создавать прозрачную форму, чтоб осталась возможность получать сообщения, так ?
« Последнее редактирование: Июль 06, 2012, 13:00 от virtual_root » Записан
Bepec
Гость
« Ответ #24 : Июль 06, 2012, 13:04 »

Если такими темпами будете делать службу, то думаю мы присутствуем при создании Microsoft 8 Skynet Edition made virtual_root.

Как бы все службы имеют hwid. Просто ты их не видишь и не ощущаешь.
Записан
Serr500
Гость
« Ответ #25 : Июль 06, 2012, 13:15 »

У меня тут ещё один вопросик... а можно ли этот код вынести в отдельный поток?  Меня затрудняет получение дескриптора окна и обработка сообщений, ведь класс будет наследоваться от QThread. Или это в принципе нельзя засунуть в поток?
И ещё один вопросик. а если я этот проект как службу буду делать, то тогда придется создавать прозрачную форму, чтоб осталась возможность получать сообщения, так ?
Можно. 1-й вариант - запихнуть в QThread, в котором есть Event Loop, пустой виджет и ловить на нём сообщения. Вероятно, это Вам будет проще всего. Не забудьте потом сделать виджету moveToThread, иначе обработчик будет "крутиться" не в том потоке. 2-й вариант, с моей точки зрения более правильный, создание собственного окна, которое будет только ловить сообщения и не отображаться. Аналогично можно поступать и в случае создания собственной службы.
Записан
virtual_root
Гость
« Ответ #26 : Июль 06, 2012, 13:28 »

а что вы подразумеваете под создание собственного окна? Окно наследованное от стандартных виджетов(QWidget, QMainWindow) или как его создать?
Записан
Serr500
Гость
« Ответ #27 : Июль 06, 2012, 13:43 »

Собственное окно создаётся функциями WinAPI, никакого наследования от стандартных виджетов не будет. Создаётся оно с помощью двух функций RegisterClass и CreateWindow(Ex). Пример создания собственного окна можно найти здесь: http://www.codenet.ru/progr/visualc/windows.php.
Записан
virtual_root
Гость
« Ответ #28 : Июль 06, 2012, 16:11 »

спасибо поняла. Попробую)
У меня возникла маленькая проблемка: пытаюсь получить список активных процессов с помощью этой фун-и WTSEnumerateProcesses. В документации написано что для работы с ней нужен всё тот же файл Wtsapi32.h и его dll. Всё это у меня уже было подключено, но почему-то компилятор ругается: 'WTSEnumerateProcesses' was not declared in this scope'  Что ему ещё не хватает??? и он не видит структуру WTS_PROCESS_INFO которая тоже относится всё к тому же файлу Wtsapi32.h
Я по ссылке прошла в этот файл, и честно говоря не нашла там ни этой фун-и ни этой структуры, походу поэтому и он не видит... Кто нибудь знает что нужно подключить дополнительно для работы с этой фун-ей и структурой?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #29 : Июль 06, 2012, 16:15 »

WTSEnumerateProcesses: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383831%28v=vs.85%29.aspx

Minimum supported client Windows 2000 Professional

Modifying WINVER and _WIN32_WINNT: http://msdn.microsoft.com/en-us/library/6sehtctf.aspx
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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