Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу перехватить событие, Помогите перехватить:) 
V
    Опции темы
Hamilion
Дата 25.3.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.3.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Запихиваю в функцию WndProc следующий код для перехвата нажатия клавиши Enter, но он почему-то не работает.
Код

switch( uMsg )  {   
...
case WM_CHAR:
switch( LOWORD(wParam) )
{
    case VK_RETURN:
    // SendMessage(hWnd, WM_COMMAND, IDC_BUTTON1, 0L);
                MessageBox(hWnd, (LPTSTR)"Уже работает", "Тяп-ляп", MB_ICONEXCLAMATION | MB_OK);
    break;
}
break;
...
}



M
Fixin
используй теги [cоde=cpp][/cоde]


Это сообщение отредактировал(а) Fixin - 25.3.2006, 15:36
PM MAIL   Вверх
Fixin
Дата 25.3.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



надо ловить WM_KEY
PM MAIL ICQ   Вверх
Hamilion
Дата 25.3.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.3.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата

надо ловить WM_KEY

Нет такого сообщения... WM_KEYDOWN - есть, WM_KEYUP - есть, WM_KEY - а нет.
PM MAIL   Вверх
Fixin
Дата 25.3.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата(Hamilion @ 25.3.2006, 16:21 Найти цитируемый пост)
WM_KEY - а нет.
имел ввиду WM_KEY*

PM MAIL ICQ   Вверх
Hamilion
Дата 25.3.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.3.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Пишу:
Код

case WM_KEYDOWN:
//case WM_KEY :
    switch( LOWORD(wParam) )
    {
        case VK_RETURN:
        //SendMessage(hWnd, WM_COMMAND, IDC_BUTTON1,0L);
MessageBox(hWnd, (LPTSTR)"Уже работает", "Тяп-ляп", MB_ICONEXCLAMATION | MB_OK);

        break;
    }
 break;

но не помогает
PM MAIL   Вверх
Fin
Дата 25.3.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Цитата

The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.

WM_KEYDOWN 
nVirtKey = (int) wParam;    // virtual-key code
lKeyData = lParam;          // key data

Может быть я ошибаюсь, но делать LOWORD(wParam) совсем не нужно.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Hamilion
Дата 25.3.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.3.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата

Может быть я ошибаюсь, но делать LOWORD(wParam) совсем не нужно.

Вы правы.
Добавлено @ 20:17
Исправил все равно не работает:
Код

case WM_KEYDOWN:
//case WM_KEY :
    switch( wParam )
    {
        case VK_RETURN:
        //SendMessage(hWnd, WM_COMMAND, IDC_BUTTON1,0L);
        MessageBox(hWnd, (LPTSTR)"Уже работает", "Тяп-ляп", MB_ICONEXCLAMATION | MB_OK);
        break;
    }
 break;

PM MAIL   Вверх
Fin
Дата 25.3.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



А у окна есть вообше фокус ввода?


--------------------
Пролетал мимо.
PM MAIL   Вверх
Hamilion
Дата 25.3.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.3.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата

А у окна есть вообше фокус ввода?

Да, если это тот который мигает в поле ввода, которое расположено в том же окне.
PM MAIL   Вверх
Fin
Дата 25.3.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Мигает коретка, и это совсем другое. Пожайлуста весь код, связанный с окном в студию.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Fixin
Дата 25.3.2006, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата(Hamilion @ 25.3.2006, 20:31 Найти цитируемый пост)
Да, если это тот который мигает в поле ввода, которое расположено в том же окне.
Тогда нужно ловить не у родительского окна, а у твоего поля ввода.

PM MAIL ICQ   Вверх
Hamilion
Дата 26.3.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.3.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Вот этот код и не работает
Код

#define IDC_BUTTON1 101
#define IDC_EDIT1    102

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG        msg; 
    HWND       hwndMain;
    WNDCLASSEX wc; 

    wc.style          = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc    = (WNDPROC)WndProc;
    wc.cbClsExtra     = 0;
    wc.cbWndExtra     = 0;
    wc.hInstance      = hInstance; 
    wc.hIcon          = LoadIcon (hInstance, lpszAppName);
    wc.hCursor        = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground    = (HBRUSH) COLOR_WINDOW;
    wc.lpszMenuName    = NULL;
    wc.lpszClassName    = lpszAppName; 
    wc.cbSize         = sizeof( WNDCLASSEX );
    wc.hIconSm        = NULL;

    if ( RegisterClassEx( &wc ) == 0 )
        return( FALSE );
    hInst = hInstance;
    hwndMain = CreateWindow( lpszAppName, lpszAppName,
                            WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX ,
                            CW_USEDEFAULT, 0, 520, 335, NULL, NULL, hInstance, NULL);
    if (!hwndMain)
        return( FALSE );
    ShowWindow( hwndMain, nCmdShow );
hEdit1 = CreateWindow( "EDIT" , "",
                                WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_NUMBER |WS_BORDER,
                                120, 30, 90, 20,
                                hwndMain, (HMENU)IDC_EDIT1, hInst, NULL );
...
hButton = CreateWindow( "BUTTON", "Выполнить",
                                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                10, 220, 100, 20,
                                hwndMain, (HMENU)IDC_BUTTON1, hInst, NULL );
...
} // end of WinMain

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    
    PAINTSTRUCT ps;
    LPMSG pMsg = (LPMSG)uMsg;
    //CURSORINFO ci;
    switch( uMsg )  
    {   
        case WM_CREATE:
            break;

        case WM_PAINT:
            BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
            break;

        case WM_KEYDOWN:
        //case WM_KEY :
            //switch( LOWORD(wParam) )
            switch( wParam )
            {
                case VK_RETURN:
// тут я пытаюсь отлавить нажатие интер вообще и передать его кнопке (если так можно конечно)
                    MessageBox(hWnd, (LPTSTR)"ERROR", "Error", MB_ICONEXCLAMATION | MB_OK);
                    SendMessage(hWnd, WM_COMMAND, IDC_BUTTON1,0L);
                    break;
            }
            break;

        case WM_COMMAND :
            switch( LOWORD(wParam) )
            {
                case BN_CLICKED :
// не работает
                    MessageBox(hWnd, (LPTSTR)"Button", "Error", MB_ICONEXCLAMATION | MB_OK);
                    break;
// только это и перехватывает
                case IDC_BUTTON1:
                    //ci.cbSize=sizeof(CURSORINFO);
                    //GetCursorInfo(ci);
                    //IsDialogMessage(hButton, pMsg);
            break;
...
} // end of wndProc

PM MAIL   Вверх
Fixin
Дата 27.3.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Код

#include <windows.h>
#include <windowsx.h>

#define IDC_BUTTON1 101    
#define IDC_EDIT1    102

static char lpszAppName[] = "Proga";

WNDPROC OldEditWndProc;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);    

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)    
{    
    MSG        msg;    
    HWND       hwndMain;    
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));
    wc.style          = CS_HREDRAW | CS_VREDRAW;    
    wc.lpfnWndProc    = (WNDPROC)WndProc;    
    wc.cbClsExtra     = 0;    
    wc.cbWndExtra     = 0;    
    wc.hInstance      = hInstance;    
    wc.hIcon          = LoadIcon (NULL, IDC_ARROW);    
    wc.hCursor        = LoadCursor (NULL, IDC_ARROW);    
    wc.hbrBackground    = (HBRUSH)(COLOR_BTNFACE+1);    
    wc.lpszMenuName    = NULL;    
    wc.lpszClassName    = lpszAppName;    
    wc.cbSize         = sizeof( WNDCLASSEX );    
    wc.hIconSm        = NULL;    
    if ( RegisterClassEx( &wc ) == 0 )    
        return( FALSE );   
    
    hwndMain = CreateWindow( lpszAppName, lpszAppName,    
                            WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX ,    
                            CW_USEDEFAULT, 0, 520, 335, NULL, NULL, hInstance, NULL);    
    if (!hwndMain)    
        return( FALSE );    
    
    ShowWindow( hwndMain, nCmdShow );        
    UpdateWindow(hwndMain);
    
    while (GetMessage(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

LRESULT CALLBACK NewButtonProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
        case WM_KEYDOWN:
            if (wParam == VK_RETURN)
            {
                HWND Button = GetDlgItem(GetParent(hwnd), IDC_BUTTON1);
                SendMessage(Button, WM_KEYDOWN, VK_SPACE, 0);
                SendMessage(Button, WM_KEYUP, VK_SPACE, 0);
            }
            break;
    }
    return CallWindowProc(OldEditWndProc, hwnd, Msg, wParam, lParam);
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )    
{
    switch( uMsg )    
    {
        case WM_DESTROY:
            {
                SubclassWindow(GetDlgItem(hWnd, IDC_EDIT1), OldEditWndProc); // это макрос из windowsx.h
                PostQuitMessage(0);
            }
            return 0;
        case WM_CREATE:
            {
            HWND Edit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT" , "",    
                                WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_NUMBER |WS_BORDER,    
                                120, 30, 90, 20,    
                                hWnd, (HMENU)IDC_EDIT1, ((CREATESTRUCT*)lParam)->hInstance, NULL );    
            OldEditWndProc = SubclassWindow(Edit, NewButtonProc);

            CreateWindow( "BUTTON", "Выполнить",    
                WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,    
                                10, 220, 100, 20,    
                                hWnd, (HMENU)IDC_BUTTON1, ((CREATESTRUCT*)lParam)->hInstance, NULL );
            SetFocus(Edit);
            }
            return TRUE;
        case WM_COMMAND:
            {
                if (LOWORD(wParam) == IDC_BUTTON1)
                {
                    HWND Edit = GetDlgItem(hWnd, IDC_EDIT1);
                    char buf[512];
                    buf[GetWindowText(Edit, buf, 512)] = 0;
                    MessageBox(hWnd, buf, "A", MB_OK);
                    SetFocus(Edit);
                }
            }
            return TRUE;
    }
    return CallWindowProc(DefWindowProc, hWnd,uMsg, wParam, lParam);
}

Отладка того, что ты дал, оказалось не таким уж и легким. Мне конечно неважно, но лучше возьми хорошую книжку, где рассказано, как писать на WinAPI.

ЗЫ: ничего не поясняю преднамеренно. разборка такого кода тебе поможет. Решение не самое оптимальное, но для обучения достаточно.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0921 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.