Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Mkaa
0 / 0 / 0
Регистрация: 31.10.2011
Сообщений: 55
1

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

13.01.2013, 01:22. Просмотров 1149. Ответов 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
Ответы с готовыми решениями:

Эмуляция нажатия клавиши и передача ее в окно
Приветствую! Необходимо имитировать нажатие клавиши shift и передать в...

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

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

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

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

1
kravam
быдлокодер
1710 / 897 / 105
Регистрация: 04.06.2008
Сообщений: 5,553
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

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

Определение нажатия клавиши
Как сделать , что бы нажал на клавишу &quot;w&quot; , к примеру и что -то там выполнялось...

Имитация нажатия клавиши
В Counter-Strike: GO для того, чтобы что-то говорить голосовой чат, надо нажать...


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

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

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