Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
nammidd
10 / 10 / 2
Регистрация: 05.06.2016
Сообщений: 168
#1

Обёртка системных событий - C++

23.09.2017, 12:46. Просмотров 209. Ответов 3
Метки нет (Все метки)

Может кто подсказать варианты как можно обернуть системные события? В других библиотеках которые попадались мне в руки это реализовано через очередь с классом события и публичную функцию которая в цикле должна вытягивать события из этого контейнера.
http://www.cyberforum.ru/cpp/thread125759.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2017, 12:46
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обёртка системных событий (C++):

Реализация событий в С++
Мне нужно реализовать события, как в Дельфи или С++ Builder, на Visual C++. Но...

Парсинг журнала событий
возникла задача, получить некоторые данные из event log'a Windows, как это все...

Класс обёртка
Стараюсь делать класс: ref class vectorByts { private: ...

Нехватка системных ресурсов
Доброго времени суток! :) Программа должна каждую десятую долю секунды делать...

Вызов системных сообщений
Дабы не плодить топики... буду тут вопросы задвать, если никто не против. ...

3
hoggy
Заблокирован
23.09.2017, 21:18 #2
Цитата Сообщение от nammidd Посмотреть сообщение
варианты как можно обернуть системные события?
можно:
Цитата Сообщение от nammidd Посмотреть сообщение
через очередь с классом события и публичную функцию которая в цикле должна вытягивать события из этого контейнера.
например...
0
Bretbas
Каждому свое
518 / 204 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
24.09.2017, 12:11 #3
nammidd, Ну можно что-то такое сделать
.h заголовочный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <windows.h>
#include <map>
#include <string>
 
class BTSWindow
{
public:
    typedef LRESULT( BTSWindow :: *FuncPointer )( LPARAM, WPARAM );
 
    struct PointerFun
    {
        BTSWindow* wnd;
        FuncPointer func;
    };
 
    void    initialize( const std :: wstring& appName, LPCWSTR iconName, int width, int height );
 
    inline HWND getHWND()       const
    {
        return _hwnd;
    }
    inline std :: wstring getAppName()  const
    {
        return _appName;
    }
 
    static LRESULT CALLBACK     wndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam );
 
        
    template<typename T> 
    inline void addEvent( UINT message, T* wnd, LRESULT ( T :: *funcpointer )( LPARAM, WPARAM ) )
    {
        if( !wnd || !funcpointer )
            return;
 
        PointerFun pointerFun;
        pointerFun.wnd      =   reinterpret_cast<BTSWindow*>(wnd);
        pointerFun.func     =   reinterpret_cast<FuncPointer>( funcpointer );
        _events.insert( std :: pair<UINT, PointerFun>( message, pointerFun ) );
        return;
    }
    inline void removeEvent( UINT message )
    {
        auto it = _events.find( message );
 
        if( it != _events.end() )
            _events.erase( it );
    }
 
private:
    HWND                    _hwnd;  
    std :: map<UINT,PointerFun> _events;
    std :: wstring              _appName;   
};
Ну и реализация .cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
void BTSWindow :: initialize( const std :: wstring& appName, LPCWSTR iconName, int width, int height )
{
    // Инициализация
    _appName    =   appName;
 
    // Заполняем оконную структуру
    WNDCLASS wnd        =   {0};
    wnd.style           =   CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wnd.lpfnWndProc =   _wndProc;
    wnd.hInstance       =   GetModuleHandle(0);
    wnd.lpszClassName   =   L"WINAPI";
    
    if( iconName != NULL )
        wnd.hIcon = LoadIcon( GetModuleHandle(0), iconName );
 
    // Регистрируем оконную структуру
    if( !RegisterClass( &wnd ) )
        return;
 
    // Создаем окно
    _hwnd = CreateWindow( 
                        L"WINAPI",
                        _appName.c_str(),
                        style,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        width,
                        height,
                        NULL,
                        NULL,
                        GetModuleHandle(0),
                        this
                    );
 
    if( !_hwnd )
        return;
 
    // Показываем окно на экране
    ShowWindow( _hwnd, SW_SHOW );
 
}
 
LRESULT CALLBACK BTSWindow :: wndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam )
{
    BTSWindow* wnd = nullptr;
 
    // Получаем указатель на наше окно
    if(message == WM_NCCREATE)
    {
        wnd = ( BTSWindow* )LPCREATESTRUCT( lparam ) -> lpCreateParams;
        SetWindowLong( hwnd, GWL_USERDATA, LONG( LPCREATESTRUCT( lparam )->lpCreateParams ) );
        wnd -> _hwnd = hwnd;
    }
 
    // Ищем в карте текущее сообщение, и выполняем функцию-обработчик этого сообщения
    wnd = ( BTSWindow* )GetWindowLong( hwnd, GWL_USERDATA );
    if( wnd )
    {
        auto it = wnd -> _events.find( message );
        if( it != wnd->_events.end() )
        {
            auto pointerFun = it -> second;
            LRESULT result = ( pointerFun.wnd->*pointerFun.func )( lparam, wparam );
            if(result)
                return result;
        }
    }
 
    return DefWindowProc( hwnd, message, wparam, lparam);
}
Ну и использовать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
WindowApp :: WindowApp()
{
    ...
    window = new BTSWindow();
    window -> initialize( L"MyApp", nullptr, CW_USEDEFAULT, CW_USEDEFAULT );
    ...
    window -> addEvent( WM_KEYDOWN, this, &WindowApp :: onKeyPressed );
    window -> addEvent( WM_KEYUP, this, &WindowApp :: onKeyReleased );
    ...
}
LRESULT BTSInput :: onKeyPressed( LPARAM lparam, WPARAM wParam )
{
    // Будем здесь, если пользователь зажмет клавишу
    return 0;
}
 
LRESULT BTSInput :: _onKeyReleased( LPARAM lparam, WPARAM wParam )
{
    // Будем здесь, если пользователь отпустит клавишу
    return 0;
}
...
1
Bretbas
Каждому свое
518 / 204 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
27.09.2017, 17:30 #4
Atakai,
Цитата Сообщение от Atakai Посмотреть сообщение
а тема про Windows разве?
Ну написал, что лучше понимаю
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2017, 17:30
Привет! Вот еще темы с решениями:

Изменение Hint системных кнопок
Всем доброго времени суток. Кто может подсказать как можно изменить Hint у...

Генерация системных сообщений windows
Как можно программно сгенерировать системное сообщение со своим текстом?

Получение системных настроек Proxy
Всем доброго времени суток. Кто в курсе как можно из системы выдернуть...

Отлавливание системных событий
Подскажите, как в Qt отлавливать системные события windows? Например мне нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru