Nur beim einfügen aus der Zwischenablage muss der Text einmal übersetzt werden.
Sonst ändert man die Zeichen schon beim schreiben.
Code: Alles auswählen
;-TOP
; Comment : Module SetGadgetCallback (Windows Only)
; Author : mk-soft
; Version : v0.02
; Created : 10.06.2018
; Updated :
;
; Syntax Callback:
; Procedure GadgetCB(hWnd,uMsg,wParam,lParam)
; Select uMsg
; ;TODO
; EndSelect
; ; Call previous gadget procedure
; ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
; EndProcedure
;
; *****************************************************************************
DeclareModule GadgetCallback
Declare SetGadgetCallback(Gadget, *lpNewFunc)
Declare CallGadgetProc(hWnd, uMsg, wParam, lParam)
EndDeclareModule
Module GadgetCallback
EnableExplicit
Global NewMap *lpPrevFunc()
Global MutexCB = CreateMutex()
; ---------------------------------------------------------------------------
Procedure SetGadgetCallback(Gadget, *lpNewFunc)
Protected GadgetID, GadgetKey.s
GadgetID = GadgetID(Gadget)
GadgetKey = Hex(GadgetID)
; Remove exists Callback
If FindMapElement(*lpPrevFunc(), GadgetKey)
SetWindowLongPtr_(GadgetID, #GWL_WNDPROC, *lpPrevFunc())
DeleteMapElement(*lpPrevFunc())
EndIf
If *lpNewFunc
If AddMapElement(*lpPrevFunc(), GadgetKey)
*lpPrevFunc() = SetWindowLongPtr_(GadgetID, #GWL_WNDPROC, *lpNewFunc)
ProcedureReturn *lpPrevFunc()
EndIf
EndIf
ProcedureReturn 0
EndProcedure
; ---------------------------------------------------------------------------
Procedure CallGadgetProc(hWnd, uMsg, wParam, lParam)
Protected result
LockMutex(MutexCB)
If FindMapElement(*lpPrevFunc(), Hex(hWnd))
result = CallWindowProc_(*lpPrevFunc(), hWnd, uMsg, wParam, lParam)
EndIf
UnlockMutex(MutexCB)
ProcedureReturn result
EndProcedure
EndModule
; *****************************************************************************
; Example
CompilerIf #PB_Compiler_IsMainFile
UseModule GadgetCallback
Procedure GadgetCB(hWnd,uMsg,wParam,lParam)
Select uMsg
Case #WM_CHAR
Select wParam
Case 'ä'
SendMessage_(hwnd, #WM_CHAR, 'a', lParam)
wParam = 'e'
Case 'Ä'
SendMessage_(hwnd, #WM_CHAR, 'A', lParam)
wParam = 'e'
Case 'ö'
SendMessage_(hwnd, #WM_CHAR, 'o', lParam)
wParam = 'e'
Case 'Ö'
SendMessage_(hwnd, #WM_CHAR, 'O', lParam)
wParam = 'e'
Case 'ü'
SendMessage_(hwnd, #WM_CHAR, 'u', lParam)
wParam = 'e'
Case 'Ü'
SendMessage_(hwnd, #WM_CHAR, 'U', lParam)
wParam = 'e'
Case 'ß'
SendMessage_(hwnd, #WM_CHAR, 's', lParam)
wParam = 's'
Case #SYN
Debug "Syn: Text wurde eingefügt"
;TODO
EndSelect
EndSelect
ProcedureReturn CallGadgetProc(hWnd,uMsg,wParam,lParam)
EndProcedure
If OpenWindow(0,0,0,800,600,"Example SetGadgetCallback",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(1,0,0,800, 600)
SetGadgetCallback(1, @GadgetCB())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
CompilerEndIf