Seite 1 von 1

ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 22.01.2018 16:52
von Fluid Byte
Funktionstasten wie BKSPACE oder ESC geben keine oder zufällige Zeichen zurück, was auch normal ist. Wenn ich aber aber Zirkumflex "^" oder Akut "´" drücke kommen chinesische Zeichen. Soll das so sein oder habe ich was übersehen?

Code: Alles auswählen

OpenWindow(0,0,0,300,100,"",#PB_Window_SystemMenu | 1)
TextGadget(0,20,20,260,60,"none",#WS_BORDER|#SS_CENTER|#SS_CENTERIMAGE)
SetGadgetColor(0,#PB_Gadget_BackColor,#White)
SetGadgetFont(0,LoadFont(0,"Arial",22,#PB_Font_Bold))

Procedure WindowCallback(hwnd,usmg,wparam,lparam)		
	If usmg = #WM_KEYDOWN
		Scancode = lParam >> 16 & $00FF
		
		Layout = GetKeyboardLayout_(0)
		
		Dim State(256)
			
		If GetKeyboardState_(State()) = #False
			ProcedureReturn 0
		EndIf	
			
		VKey = MapVirtualKeyEx_(Scancode,1,Layout)
		
		ToAsciiEx_(VKey,Scancode,State(),@lpChar,0,Layout) 		
		
 		SetGadgetText(0,PeekS(@lpChar))
		
		ProcedureReturn 0
	EndIf
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

Repeat : Until WaitWindowEvent()  = #PB_Event_CloseWindow

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 22.01.2018 17:21
von RSBasic
Es hat damit zu tun, dass bei dir Unicode aktiviert ist. Ohne Unicode gehts.
D.h. du musst es nach Unicode konvertieren oder nach einer Unicode-Funktion suchen.

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 22.01.2018 17:55
von mk-soft

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 22.01.2018 19:23
von Fluid Byte
RSBasic hat geschrieben:Es hat damit zu tun, dass bei dir Unicode aktiviert ist. Ohne Unicode gehts.
D.h. du musst es nach Unicode konvertieren oder nach einer Unicode-Funktion suchen.
Ich kann mich dunkel erinnern das es früher in den Compiler-Optionen eine Einstellung gab um Unicode zu aktivieren/deaktivieren. Ist es das was du meinst? Das Ding ist, diese Option gibt es bei mir nicht.

Teste ich diesen Code bestätigt er das Unicode aktiviert ist.

Code: Alles auswählen

CompilerIf #PB_Compiler_Unicode 
	Debug "Unicode = True"
CompilerElse
	Debug "Unicode = False"
CompilerEndIf
Und die Dokumentation zeigt Unicode als Compiler-Option:

https://www.purebasic.com/german/docume ... piler.html

Bild

Ich benutze PB v5.61 / 64bit. Ist das normal oder ein Bug?
mk-soft hat geschrieben:ToUnicodeEx...

Link https://msdn.microsoft.com/de-de/librar ... s.85).aspx
So läufts einwandfrei, gracias.

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 22.01.2018 19:37
von Fluid Byte
Gerade das hier gefunden:

https://www.purebasic.com/documentation ... story.html
25th July 2016 : Version 5.50

- Removed: ASCII mode for internal PureBasic string representation, PureBasic is now unicode only.
Hat sich somit erledigt

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 22.01.2018 19:42
von mk-soft
Der Ascii Support endet mit der PB-Version 5.46 LTS.

Mit der Version 5.6x kann man nur noch Unicode Applikationen schreiben.

Sollte man zur Übergabe von Textdaten noch Ascii oder UTF8 benötigen, so gibt es seit dem zwei neue Befehle

*mem = ASCII(text) und *mem = UTF8(text)

P.S.
Einfaches Handling von Ascii und UTF8 Daten im Unicode Programm

Code: Alles auswählen

Structure udtArray
  a.a[0]
  b.b[0]
  c.c[0]
  w.w[0]
  ; etc
EndStructure

Macro AsciiByteLen(mem)
  (MemorySize(mem) - 1)
EndMacro

Macro UTF8ByteLen(mem)
  (MemorySize(mem) - 1)
EndMacro

*mem.udtArray = Ascii("Hello World")
len = AsciiByteLen(*mem)
Debug "Len = " + len
Debug PeekS(*mem, -1, #PB_Ascii)
FreeMemory(*mem)

*mem.udtArray = UTF8("Hello World, äöü")
len = UTF8ByteLen(*mem)
Debug "Len = " + len
Debug PeekS(*mem, -1, #PB_UTF8)

For i = 0 To Len ; with Nullbyte
  Debug "Char " + i+ ": " + Hex(*mem\a[i], #PB_Byte)
Next                     
FreeMemory(*mem)

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 23.01.2018 01:03
von Fluid Byte
Ich will jede Taste auf dem Keyboard lesen und den entsprechenden Namen, abhängig von der Systemsprache, per Text ausgeben.

Das funktioniert hiermit ganz gut:

Code: Alles auswählen

OpenWindow(0,0,0,280,150,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(0,10,10,100,20,"CHARACTER")
TextGadget(1,10,80,100,20,"VIRTUAL KEY")
TextGadget(2,150,80,100,20,"SCAN CODE")
SetGadgetFont(#PB_Default,LoadFont(0,"Segoe UI",10,#PB_Font_Bold))
TextGadget(3,10,30,260,40,"none",#WS_BORDER | #SS_CENTER | #SS_CENTERIMAGE)
TextGadget(4,10,100,120,40,"none",#WS_BORDER | #SS_CENTER | #SS_CENTERIMAGE)
TextGadget(5,150,100,120,40,"none",#WS_BORDER | #SS_CENTER | #SS_CENTERIMAGE)

SetGadgetColor(3,#PB_Gadget_BackColor,#White)
SetGadgetColor(4,#PB_Gadget_BackColor,#White)
SetGadgetColor(5,#PB_Gadget_BackColor,#White)

Procedure.s GetKeyName(wParam,lParam)
	Protected Buffer$ = Space(256)
	
	GetKeyNameText_(lparam,Buffer$,256)
	SetGadgetText(3,Buffer$)
	SetGadgetText(4,Str(wParam))
	SetGadgetText(5,Str((lParam >> 16) & $FF))	
	
	ProcedureReturn Buffer$
EndProcedure

Procedure WindowCallback(hWnd,uMsg,wParam,lParam)
	Select uMsg		
		Case #WM_KEYUP ; PRINT KEY
		If wParam = #VK_SNAPSHOT
			GetKeyName(wParam,lParam)
			
			ProcedureReturn 0
		EndIf				

		Case #WM_SYSKEYDOWN ; LEFT ALT / F10
		GetKeyName(wParam,lParam)		
		
		ProcedureReturn 0

 		Case #WM_KEYDOWN
		GetKeyName(wParam,lParam)		
		
		ProcedureReturn 0
	EndSelect
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

SetWindowCallback(@WindowCallback())

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Zwei Fragen diesbezüglich:

1.) Drücke ich die Tasten "/" und "*" auf dem Numpad steht da nur "(ZEHNERTASTATUR)" ohne das Zeichen das die Taste repräsentiert. Drücke ich ENTER steht da "ENTER (ZEHNERTASTATUR)". So sollte es auch für die beiden erwähnten Tasten sein.

Also "/ (ZEHNERTASTATUR)" und "* (ZEHNERTASTATUR)"

2.) Wie kann ich den TAB key auslesen? Drücke ich diese Taste kommen lediglich 3 Nachrichten:

Code: Alles auswählen

; #WM_COMMAND ; 273
; WM_QUERYUISTATE ; 297
; WM_KEYUP ; 257
Kein #WM_KEYDOWN oder #WM_SYSKEYDOWN. Ist das normal?

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 23.01.2018 01:10
von HeX0R
zu 2:

Code: Alles auswählen

RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)

Re: ToAsciiEx gibt chinesische Zeichen zurück

Verfasst: 23.01.2018 01:50
von Fluid Byte
Danke, wäre ich in 100 Jahren nicht drauf gekommen.