Нужно обработать нажатие клавиши enter в редактируемой области COMBOBOXEX: Код (Text): INVOKE SendMessage,hCombo,CBEM_GETEDITCONTROL,NULL,NULL mov hEdit,eax INVOKE SetWindowLong,hEdit,GWL_WNDPROC,OFFSET ComboEditProc mov OldComboEditProc,eax далее Код (Text): ComboEditProc PROC hDlg:HWND,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM mov eax,uMsg .if eax==WM_KEYDOWN mov eax,wParam .if al==VK_RETURN ;----------------- [Обработка нажатия ENTER] -------------------- INVOKE SendMessage,ComboOwner,WM_COMMAND,BN_CLICKED,IDC_REN_ADDTEMPL .else INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam ret .endif .else INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam ret .endif xor eax,eax ret ComboEditProc endp WM_KEYDOWN обрабатывается, а VK_RETURN - нет. Как заставить это работать?
Да, combobox на диалоге, диалог на tabcontrol, tabcontrol на диалоге, использующемся как основное окно.
Если сабклассить сам COMBOBOXEX, то VK_RETURN и тут не отлавливается.WM_NOTIFY -> NM_RETURN от EDIT тоже отсутствует. Пробовал устанавливать обработчик WM_NOTIFY (без всякого сабклассинга) в процедуре диалога на NM_RETURN - не помогает. Может другой какой контрол попробовать?
в edit'е на ListView'е на диалогах работает: Код (Text): ... .elseif e_uMsg==WM_GETDLGCODE .if e_wParam == VK_RETURN inva_win GetParent, hEdit_lv inv_win PostMessage, hEdit_lv, WM_KILLFOCUS, eax, 0 or eax, -1 ret .elseif e_wParam==VK_ESCAPE inv_win SendMessage, hEdit_lv, WM_SETTEXT, 0, OF tx_ed_old inva_win GetParent, hEdit_lv inv_win PostMessage, hEdit_lv, WM_KILLFOCUS, eax, 0 or eax, -1 ret .endif ...
Спасибо, yureckor. Теперь все выглядит так (вдруг кому понадобится): Код (Text): INVOKE SendMessage,hCombo,CBEM_GETEDITCONTROL,NULL,NULL mov hEdit,eax INVOKE SetWindowLong,hEdit,GWL_WNDPROC,OFFSET ComboEditProc mov OldComboEditProc,eax ... ComboEditProc PROC hDlg:HWND,uMsg:DWORD,wParam:WPARAM, lParam:LPARAM mov eax,uMsg .if eax==WM_GETDLGCODE .if wParam == VK_RETURN ;ваш код .else INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam ret .endif .else INVOKE CallWindowProc,OldComboEditProc,hDlg,uMsg,wParam,lParam ret .endif xor eax,eax ret ComboEditProc endp
shoo ES_WANTRETURN Specifies that a carriage return be inserted when the user presses the ENTER key while entering text into a multiline edit control in a dialog box. If you do not specify this style, pressing the ENTER key has the same effect as pressing the dialog box's default push button. This style has no effect on a single-line edit control. http://msdn.microsoft.com/library/d...s/editcontrolreference/editcontr olstyles.asp
ну вот, цитаты из библии если хочешь субклассировать эдит и отловить в нем нажатие энтер - нужно применять этот стиль (или даже оба 8) а вообще я же поправился - по ссылке на форуме лежит имитатор командной строки как в тотале - комбобокс, нажимаешь энтер - получаешь выполнение. автор не я, поэтому не могу выложить "от себя". ключевой момент там - в субклассирующей процедуре отловить сообщение WM_GETDLGCODE и вернуть ему DLGC_WANTALLKEYS, тогда через оконную процедуру комбобокса будут пропускаться все нажатия клавиш (в тч энтер).
кстати, раньше я тоже парился с отловом нажатия Enter'а в edit'е, и сабклассировал его. А ща нашел случайно (верней знал эффект давно, но не задумывался), что в родительский диалог приходит IDM с кодом 1. Код (Text): .elseif eax==WM_COMMAND mov eax, [wParam] and eax, 0FFFFh .if [lParam]==0 ;--------------------------------IDM_ ;--------------------------------IDM_OPEN .if eax==IDM_OPEN ... ;--------------------------------IDM_ENTER? .elseif eax==1 ...
я этот момент использовал для выбора кнопки по умолчанию (см wafasm - Go All) - есть разница, чем вызывался диалог - мышью или клавиатурой, и у меня получалась кнопка "текущая" одна, а нажималась от энтера другая 8) - пришлось отлавливать единицу и "нажимать" самому