mam rozwiązanie, ale w ibpro - subclassing. Robisz sobie tylko jedną funkcję dla WM_CHAR i WM_KEYDOWN
zamiast
return klawisz(hwnd, wParam)
zrób po swojemu bo to blokuje wpisywanie klawiszy np. do edita
$include "windows.inc"
dialog d1
CREATEDIALOG d1,0,0,295,199,0x80C80080,0,"Caption",&mainwindow
CONTROL d1,@BUTTON,"Button1",12,8,70,20,0x50000000,1
CONTROL d1,@CHECKBOX,"Check1",23,147,70,20,0x50000003,4
CONTROL d1,@COMBOBOX,"ComboBox1",222,0,70,50,0x50800603,5
CONTROL d1,@RICHEDIT,"",219,135,70,60,0x50800004,6
CONTROL d1,@SCROLLBAR,"",201,48,70,20,0x50000000,7
CONTROL d1,@LISTBOX,"ListBox1",137,135,70,60,0x50800140,8
CONTROL d1,@RADIOBUTTON,"Radio1",24,130,70,20,0x50000009,9
CONTROL d1,@SCROLLBAR,"",169,48,20,70,0x50000001,10
CONTROL d1,@GROUPBOX,"Group",9,52,70,60,0x50000007,11
CONTROL d1,@EDIT,"Edit1",220,26,70,20,0x50800000,12
controlex d1, "systabcontrol32","",20, 10, 514,303,_
TCS_FLATBUTTONS|WS_CLIPSIBLINGS|WS_TABSTOP,0,2
showdialog d1
'12 - ilość kontrolek + główne okno
UINT array[12,2], i
array[0, 0] = d1.hwnd
array[0, 1] = SetWindowLong(d1.hwnd, GWL_WNDPROC, &Subclass)
i = 1
EnumChildWindows(d1.hwnd, &enum, 0)
waituntil d1.hwnd = 0
'-------------
sub enum(hwnd:uint, lparam:uint),int
array[i, 0] = hwnd
array[i, 1] = SetWindowLong(hwnd, GWL_WNDPROC, &Subclass)
i++
return (i<12)
endsub
'-------------
sub Subclass(hwnd:uint, uMsg:uint, wParam:uint, lParam:uint),uint
if uMsg = WM_CHAR then return klawisz(hwnd, wParam)
if uMsg = WM_KEYDOWN then return klawisz(hwnd, 0)
return CallWindowProc(GetProcByHwnd(hwnd),_
hwnd, uMsg, wParam, lParam)
endsub
'-------------
sub GetProcByHwnd(hwnd:uint),uint
INT i
for i = 0 to 11
if array[i, 0] = hwnd then return array[i, 1]
next i
return 0
endsub
'-------------
sub klawisz(hwnd:uint, kod:int),int
setcaption d1, using("hwnd:# kod:#", hwnd, kod)
MessageBeep(MB_ICONHAND)
return 0
endsub
'-------------
sub unsubclass(),int
INT i
for i = 0 to 11
SetWindowLong(array[i, 0], GWL_WNDPROC, array[i, 1])
next i
return 1
endsub
'-------------
sub mainwindow
select @message
case @idinitdialog
centerwindow d1
case @idclosewindow
unsubclass()
closedialog d1
endselect
return
endsub
ponoć Capture też przekierowuje WM_CHAR do jednego okna, ale nie widzi mi się to, bo SetCapture() z leksza blokuje okno :-/ no i tylko jedno okno może mieć capture