Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Mkaa
0 / 0 / 0
Регистрация: 31.10.2011
Сообщений: 55
#1

Отлов нажатия клавиши. Определить активное окно - C++ WinAPI

13.01.2013, 01:22. Просмотров 1098. Ответов 1
Метки нет (Все метки)

Отлов нажатия клавиши. Определить активное окно
Вот окно.
Вот код обработки сис. сообщений.
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
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        case WM_COMMAND:
            {
            if(wParam==10000)
            {
             ChangeTitle(ttext[1]);
            }      
        
            return 0;
        
            }
        break;
        case WM_KEYDOWN:
             switch (wParam) {
                             case VK_LEFT:
                                  ChangeTitle(ttext[2]);//<================
                             break;
                         }
             break;     
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, msg, wParam, lParam);
    }
 
    return 0;
}
Кода компилирую и запускаю. Жму Клавишу "LEFT" то все работает.
Когда выбираю Форму(Второе окно с классом EDIT) нажатие клавиши не работает.
Когда переключаюсь на другое окно и перехожу обратно. Нажатие клавиши работает.
Вообще хочу, чтобы нажатие клавиши отлавливалось даже когда окно не активно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 01:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Отлов нажатия клавиши. Определить активное окно (C++ WinAPI):

Эмуляция нажатия клавиши и передача ее в окно - C++ WinAPI
Приветствую! Необходимо имитировать нажатие клавиши shift и передать в программу. HWND hWnd = FindWindowA(&quot;VirtuaNESwndclass&quot;,...

Дочернее окно не обрабатывает события нажатия клавиши - C++ WinAPI
Всем привет. Создаю 2 окна одно главное, второе дочернее, мне надо чтобы при нажатии определенных клавиш в дочернем окне происходили...

Отлов нажатия кнопок за пределами формы - C++ WinAPI
Т.к. с WIN API знаком только по наслышке, пришел к Вам за помощью с кодом! Надо при скрытом окне выполнять функцию по нажатию на клавишу....

Всегда активное окно средствами WinAPI - C++ WinAPI
Привет всем! Подскажите плиз, какое св-во прописать, чтобы окно было всегда активное? То есть при нажатии на остальные окна, мое окно...

Как получить информацию, о том что окно стало не активное - C++ WinAPI
Как получить информацию, о том что окно стало не активное? И мышка ушла за рамки окна?

Как узнать, владеет ли активное окно кареткой (и можно ли вообще) ? - C++ WinAPI
Суть в том, что нужно по сочетанию клавиш отобразить менюшку рядом с курсором ввода, если в этом окне вообще есть какой-нибудь ввод. Я...

1
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
13.01.2013, 12:02 #2
Во тебе пример. там создаются 6 edi-ов, но можешь создать сколько хочешь, устанавливается в макросе.
По нажатию в одной клавиши, этот же символ отображается во всех остальных
Причина кроется в суперклассинге. Порекомендовал бы туториалы айзелиона на wasmе, но он приказал, похоже долго жить.

То есть пишешь оконную процедуру какую тебе надо и делаешь так, чтобы все окна определённого класса использовали эту процедуру. В данном случае все edit; просто ты меняешь поведение каждого edit-а
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <windows.h>
#include <stdio.h>
 
#define kol_vo_edit 6
 
 
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EditWndProc (HWND hEdit,DWORD uMsg, DWORD wParam, DWORD lParam);
 
 
char ClassName []="SuperclassWinClass";
char AppName []= "Superclassing Demo";
char EditClass []="EDIT";
char OurClass []= "SUPEREDITCLASS";
char Message []= "You pressed the Enter key in the text box!";
 
 
 
HWND hwndEdit [kol_vo_edit];
WNDPROC OldWndProc;
 
//У айзелиона это есть, а тут оказалось ненужным
//Но по идее не нужны, но оставлю уж
HINSTANCE hInstance;
LPSTR CommandLine;
 
//+++++++++++++++++++++++++++++++++
 
int WINAPI WinMain (HINSTANCE hInst,
                    HINSTANCE hPrevInst,
                    LPSTR CmdLine,
                    int CmdShow)
 
{
 
 hInstance= hInst;
 CommandLine= CmdLine;
 
 //структуры
 WNDCLASSEX wc;
 MSG msg;
 HWND hwnd;
 
 //инициализация;
 wc.cbSize= sizeof (WNDCLASSEX);
 wc.style= CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc= WndProc;
 wc.cbClsExtra= 0;
 wc.cbWndExtra= 0;
 wc.hInstance= hInst;
 wc.hbrBackground= (HBRUSH)(COLOR_APPWORKSPACE);
 wc.lpszMenuName= 0;
 wc.lpszClassName= ClassName;
 wc.hIcon= LoadIcon (NULL,IDI_APPLICATION);
 wc.hIconSm= wc.hIcon;
 wc.hCursor= LoadCursor (NULL,IDC_ARROW);
 
 
 RegisterClassEx (&wc);
 
 hwnd= CreateWindowEx (WS_EX_CLIENTEDGE+WS_EX_CONTROLPARENT, ClassName,AppName,\
           WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\
           CW_USEDEFAULT,350,220,NULL,NULL,\
           hInst,NULL);
 
 
 
 
 while (true) {
   if (!GetMessage (&msg,NULL,0,0))
     break;
    TranslateMessage (&msg);
    DispatchMessage  (&msg);
 }
 return msg.wParam;
}
 
//+++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++
//hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  WNDCLASSEX wc;
  
  if (uMsg==WM_CREATE) {
 
        wc.cbSize= sizeof (WNDCLASSEX);
        GetClassInfoEx (NULL,EditClass, &wc);
        OldWndProc= wc.lpfnWndProc;
        wc.lpfnWndProc= (WNDPROC)EditWndProc;
        wc.hInstance= hInstance;
        wc.lpszClassName= OurClass;
        RegisterClassEx (&wc);
        int ebx= 0;
        int edi= 20;
        
        while (ebx< kol_vo_edit) {
            HWND eax; 
            eax= CreateWindowEx (WS_EX_CLIENTEDGE, OurClass,NULL,WS_CHILD+WS_VISIBLE+WS_BORDER,20,edi,300,25,hWnd,(HMENU)ebx,hInstance,NULL);       
            *(HWND*)(hwndEdit+ ebx)= eax;  
            edi+=25;
            ebx++;
        }
        SetFocus (*hwndEdit);
  }
  else if (uMsg==WM_DESTROY) 
        PostQuitMessage (0);
  else
        return DefWindowProc (hWnd,uMsg,wParam,lParam);     
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
 
LRESULT CALLBACK EditWndProc (HWND hEdit,DWORD uMsg, DWORD wParam, DWORD lParam) {
 
 //ЭТот флаг поднимается одной из оконных функций, когда она собирается 
 //передать сообщение другим окнам- собратьям
 static bool flag= false;
 
 
 if (uMsg==WM_CHAR) {
    
    //У на имеется шесть окон edit, одно и них получило сообщение 
    //char, наша цель- продублировать это сообщение вовсе остальные окна
    //Если флаг опущен
    if (!flag) {
        //подымем его
        flag= true;
        
        //Поехали передавать, 
        for (int i= 0; i< kol_vo_edit; i++) { 
          //Только самому себе не передать бы
          if (hwndEdit[i]!= hEdit)  
             SendMessage (hwndEdit[i], WM_CHAR, wParam, lParam);
        }    
        //передали, тоеперь скидываем флаг
        flag= false;
    }
 }
 return CallWindowProc (OldWndProc,hEdit,uMsg,wParam,lParam);     
 
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2013, 12:02
Привет! Вот еще темы с ответами:

Определение нажатия клавиши - C++ WinAPI
Как сделать , что бы нажал на клавишу &quot;w&quot; , к примеру и что -то там выполнялось , через GetAsynKeyState можно это сделать? Как вообще...

Эмуляция нажатия клавиши - C++ WinAPI
Подскажите плс как емулировать нажатие клавиши в неактивном окне?

Эмуляция нажатия клавиши - C++ WinAPI
Подскажите как отправить окну сообщение, что нужно нажать клавишу Enter? Точнее напишите функцию SendMessage с параметрами для клавиши...

Имитация нажатия клавиши - C++ WinAPI
В Counter-Strike: GO для того, чтобы что-то говорить голосовой чат, надо нажать и удерживать определённую кнопку. (У меня например, это Q)....


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

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

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