Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2009, 21:40   #1
MSga
 
Регистрация: 29.12.2009
Сообщений: 8
По умолчанию WM_KYEDOWN у дочернего окна.

Подскажите почему не работает событие WM_KEYDOWN у дочернего окна, а срабатывает у родителя?
MSga вне форума Ответить с цитированием
Старый 29.12.2009, 22:03   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

покажите код.
что за окно?
что за дочернее окно?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.12.2009, 22:10   #3
MSga
 
Регистрация: 29.12.2009
Сообщений: 8
По умолчанию

Основное окно:
push null
push [Inst]
push null
push null
push [WindowHeight] ;Âûñîòà Bottom - Top
push [WindowWidth] ;Øèðèíà Right - Left
push [WindowTop] ;X Top
push [WindowLeft] ;Y Left
push WS_OVERLAPPEDWINDOW
push MainCaption
push ClassName
push null
call [CreateWindowEx]

mov [MainWndHandle], eax


Дочернее:
push null
push [Inst]
push null
push [MainWndHandle]
push 800 ;Âûñîòà
push 1000 ;Øèðèíà
push 0 ;X
push 200 ;Y
push WS_CHILDWINDOW + WS_CAPTION + WS_TABSTOP
; push WS_OVERLAPPEDWINDOW
push null
push ClassName
push null
call [CreateWindowEx]


У каждого свой класс. И своя процедура обработки событий.
Вот процедура дочернего:

.WndProc:
;[ebp + 8] - hwnd
;[ebp + 12] - uMsg
;[ebp + 16] - wParam
;[ebp + 20] - lParam

push ebp
mov ebp, esp

cmp dword [ebp + 12], WM_CREATE
jz .WMCreate

cmp dword [ebp + 12], WM_KEYDOWN
jz .WMKeyDown

cmp dword [ebp + 12], WM_COMMAND
jz .WMCommand

.DefWindow:
push dword [ebp + 20]
push dword [ebp + 16]
push dword [ebp + 12]
push dword [ebp + 8]
call [DefWindowProc]

.EndWndProc:
pop ebp

ret 16


.WMCreate:

jmp .EndWndProc


.WMKeyDown:
push MB_OK
push null
push null
push null
call [MessageBox]

jmp .DefWindow

.WMCommand:
push MB_OK
push null
push null
push null
call [MessageBox]

jmp .EndWndProc
MSga вне форума Ответить с цитированием
Старый 29.12.2009, 22:22   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

регистрации класов окна не вижу, и так же основного цикла сообщений тоже не заметил.
кстати оформляйте код с помощью кнопки
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.12.2009, 22:35   #5
MSga
 
Регистрация: 29.12.2009
Сообщений: 8
По умолчанию

Регистрация основного класса:
Код:
        mov     eax, CS_HREDRAW + CS_VREDRAW
        mov     [WinClass.Style], eax
        mov     [WinClass.WndProc], WndProc
        mov     [WinClass.ClassExtra], null
        mov     [WinClass.WndExtra], null
        mov     eax, [Inst]
        mov     [WinClass.Instance], eax

        push    1
        push    eax
        call    [LoadIcon]
        mov     [WinClass.Icon], eax

        push    IDC_ARROW
        push    null
        call    [LoadCursor]
        mov     [WinClass.Cursor], eax

        push    [ColorMainWindow]
        call    [CreateSolidBrush]

        mov     [WinClass.Background], eax
        mov     [WinClass.MenuName], null
        mov     [WinClass.ClassName], ClassName

        push    WinClass
        call    [RegisterClass]

Обработчик событий основного класса:
Код:
WndProc:
        ; -=============== Ïðîöåäóðà îñíîâíîãî êëàññà ===============-
        ;[ebp+8] - hwnd
        ;[ebp+12] - uMsg
        ;[ebp+16] - wParam
        ;[ebp+20] - lParam

        push   ebp
        mov    ebp, esp

        cmp     dword ptr ebp + 12, WM_DESTROY
        jz      WMDestroy

        cmp     dword ptr ebp + 12, WM_SIZE
        jz      WMSize

        cmp     dword ptr ebp + 12, WM_COMMAND
        jz      WMCommand

        cmp     dword ptr ebp + 12, WM_MEASUREITEM
        jz      WMMeasureItem

        cmp     dword ptr ebp + 12, WM_DRAWITEM
        jz      WMDrawItem

       ; cmp     dword [ebp + 12], WM_KEYDOWN
       ; jz      WMKeyDown

DefWindow:
        push   dword ptr ebp + 20
        push   dword ptr ebp + 16
        push   dword ptr ebp + 12
        push   dword ptr ebp + 8
        call   [DefWindowProc]

EndWndProc:
        pop     ebp

        ret     16

WMCommand:
        cmp     dword ptr ebp + 16, 104
        jz      WMDestroy

        jmp     EndWndProc

WMKeyDown:
        push    MB_OK
        push    null
        push    null
        push    null
        call    [MessageBox]

       jmp     EndWndProc
Регистрация дочернего класса:
Код:
        mov     dword [WndClass + WNDCLASS.Style], CS_HREDRAW + CS_VREDRAW + CS_DBLCLKS
        mov     dword [WndClass + WNDCLASS.WndProc], .WndProc
        mov     dword [WndClass + WNDCLASS.ClassExtra], null
        mov     dword [WndClass + WNDCLASS.WndExtra], sizeof.EDITCODE
        push    [Inst]
        pop     dword [WndClass + WNDCLASS.Instance]

        push    1
        push    eax
        call    [LoadIcon]
        mov     dword [WndClass + WNDCLASS.Icon], eax

        push    IDC_ARROW
        push    null
        call    [LoadCursor]
        mov     dword [WndClass + WNDCLASS.Cursor], eax

        push     0FFFFFFh
        call    [CreateSolidBrush]

        mov     dword [WndClass + WNDCLASS.Background], eax
        mov     dword [WndClass + WNDCLASS.MenuName], null
        mov     dword [WndClass + WNDCLASS.ClassName], EditCodeClassName

        mov     eax, ebp
        sub     eax, sizeof.WNDCLASS

        push    eax
        call    [RegisterClass]
Обработчик событий дочернего класса:
Код:
.WndProc:
        ; -=============== Ïðîöåäóðà îñíîâíîãî êëàññà ===============-
        ;[ebp + 8] - hwnd
        ;[ebp + 12] - uMsg
        ;[ebp + 16] - wParam
        ;[ebp + 20] - lParam

        push   ebp
        mov    ebp, esp

        cmp     dword [ebp + 12], 0Dh
        jz      .DefWindow


        cmp     dword [ebp + 12], WM_CREATE
        jz      .WMCreate

        cmp     dword [ebp + 12], WM_KEYDOWN
        jz      .WMKeyDown

        cmp     dword [ebp + 12], WM_COMMAND
        jz      .WMCommand

.DefWindow:
        push   dword [ebp + 20]
        push   dword [ebp + 16]
        push   dword [ebp + 12]
        push   dword [ebp + 8]
        call   [DefWindowProc]

.EndWndProc:
        pop     ebp

        ret     16


.WMCreate:

        push     20
        push     1
        push     null
        push     dword [ebp + 8]
        call     [CreateCaret]

        push    0
        push    0
        call    [SetCaretPos]

        push    dword [ebp + 8]
        call    [ShowCaret]

        jmp     .EndWndProc


.WMKeyDown:
        push    ebp
        push    MB_OK
        push    null
        push    null
        push    null
        call    [MessageBox]
        pop     ebp

       jmp     .DefWindow
MSga вне форума Ответить с цитированием
Старый 29.12.2009, 22:47   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

основного цикла сообщений я так и не увидел.
вообще причин много...второе окно отображается?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.12.2009, 22:51   #7
MSga
 
Регистрация: 29.12.2009
Сообщений: 8
По умолчанию

Код:
NextMessage:
        ; -===== Ïîëó÷èòü î÷åðåäíîå ñîîáùåíèå =====- ;
        push    null
        push    null
        push    null
        push    WndMessage
        call    [GetMessage]
        ; -===== Ïîëó÷èòü î÷åðåäíîå ñîîáùåíèå =====- ;

        or     eax, eax
        jz     Exit

        push    WndMessage
        call    [TranslateMessage]

        push    WndMessage
        call    [DispatchMessage]

        jmp     NextMessage

Exit:
        ; -===== Âûõîä èç ïðîãðàììû =====- ;
        push    null
        call    [ExitProcess]
        ; -===== Âûõîä èç ïðîãðàììû =====- ;
Да. Окно дочернее отображается. И ловит все события кроме WM_KEYDOWN.
MSga вне форума Ответить с цитированием
Старый 29.12.2009, 22:59   #8
MSga
 
Регистрация: 29.12.2009
Сообщений: 8
По умолчанию

Вот какой важный фактор забыл указать.
Если в дочернем окне ситль поменять на "WS_OVERLAPPEDWINDOW".
То все начинает работать так как нужно.
MSga вне форума Ответить с цитированием
Старый 31.12.2009, 10:39   #9
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Попробуй через WM_COMMAND
Д'якон вне форума Ответить с цитированием
Старый 02.01.2010, 18:09   #10
MSga
 
Регистрация: 29.12.2009
Сообщений: 8
По умолчанию

Событие WM_COMMAND вообще не срабатывает.
Может в таком режиме (WS_CHILDWINDOW) вообще не работает WM_KEYDOWN. У кого нить получилось перехватить его?
MSga вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
API определение дочернего окна senia Win Api 6 25.12.2009 01:23
Изменение данных дочернего окна damned20 Win Api 1 11.08.2009 13:04
Выделение дочернего окна и пункта меню joker Win Api 7 04.02.2009 18:16
Получение хэндла дочернего контрола Lich Win Api 7 01.07.2008 10:58
Разбиение дочернего окна на колонки... HunterMan Win Api 3 03.04.2008 23:19