Tastatur Systemweit überwachen und weiterleiten?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Tastatur Systemweit überwachen und weiterleiten?

Beitrag von Ghosty1967 »

...und wieder einmal eine Frage, welche mich an meine bescheidenen
Grenzen bringt :D

Problem:
Ich arbeite mit einer Messanwendung, welche von mir eine Druckeingabe in
der Form z.B. "0.00175 für 1.75E-3 mbar" verlangt. Wichtig dabei ist der
Punkt als Kommazeichen. Da ich wie wohl die meisten, die Daten am
schnellsten über den Ziffernblock eingeben kann, dieser allerdings von Haus
aus nur das KOMMA bietet, muß ich natürlich umgreifen und das nervt.

Lösung(?):
Ist es in PB irgendwie möglich, das "," des Ziffernblocks Systemweit zu
überwachen, wenn es gedrückt wurde in einen "." umzumodeln und an ein
Eingabefeld in einer externen Anwendung umzuleiten ?!
Mir schwebt ein kleines Programm vor, welches z.B. im Systemtray läuft
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Meine Unwissenheit quält mich... Ich steig da nicht so ganz durch ! :oops:
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

ich hab am code mal rumgepfuscht .. könnte so gehen.

Code: Alles auswählen

; 
; by Danilo, 07.04.2003 - german forum 
; erweitert durch nicthequick 
;verpfuscht durch bobobo
;
Global hWindow,msg,hook 

#VK_OEM_PERIOD = $BE

Structure KBDLLHOOKSTRUCT 
  vkCode.l 
  scanCode.l 
  flags.l 
  time.l 
  dwExtraInfo.l 
EndStructure 

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT) 
  
  If nCode = #HC_ACTION 
    If *p\vkCode = #VK_DECIMAL;LWIN; Or *p\vkCode = #VK_RWIN 
      If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN 
        keybd_event_(#VK_OEM_PERIOD, 0, 0, 0) 
        keybd_event_(#VK_OEM_PERIOD, 0, #KEYEVENTF_KEYUP, 0) 
        ProcedureReturn 1 
      ElseIf wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP 
        ProcedureReturn 1 
      EndIf 
    EndIf 
  EndIf 
  
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p) 
EndProcedure


; Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT) 
;    If nCode = #HC_ACTION 
;       If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP 
;          #LLKHF_ALTDOWN = $20 
;          If *p\vkCode = #VK_LWIN Or *p\vkCode = #VK_RWIN 
;             ProcedureReturn 1 
;          EndIf 
;        EndIf 
;     EndIf 
; ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p) 
; EndProcedure 

Procedure AskForExit() 
  If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES 
     UnhookWindowsHookEx_(hook) : End 
  EndIf 
EndProcedure 

; Win NT 
#WH_KEYBOARD_LL = 13 
hook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@myKeyboardHook(),GetModuleHandle_(0),0) 
If hook = 0: End: EndIf 

hWindow     = OpenWindow(1,0,0,10,10,"k8D h00K",#PB_Window_Invisible) 


; by daniel, 21. Nov 2002 (german Tips&Tricks) 
  SystemPath$ = Space(1024) : GetSystemDirectory_(SystemPath$,1024) 
  hIcon       = ExtractIcon_(0,SystemPath$+"\user32.dll",1) 
;----- 


AddSysTrayIcon(1,WindowID(1),hIcon) 
SysTrayIconToolTip(1,"k8D h00K") 
msg = RegisterWindowMessage_("DKs_k8D_h00K") 


Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow : End 
    Case #PB_Event_Menu 
      If EventMenu() = 20 : AskForExit() : EndIf 
    Case #PB_Event_SysTray 
      If EventType() = #PB_EventType_LeftDoubleClick 
        AskForExit() 
      EndIf 
  EndSelect 
ForEver
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Dark Skillu
Beiträge: 103
Registriert: 18.03.2007 15:03

Beitrag von Dark Skillu »

Sry Ka was du da proggen willst, verstehe ich nicht ganz, klingt für mich Anfänger irgendwie nach Keylogger(Systemtray, Tastatur (Ziffernblock) überwachen ) :lol:
Bitte berichtigt mich falls ich was falsch verstanden habe, ich nehme mal nicht an , dass er sowas coden will .
Ich benutze PureBasic 4.0.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

@Dark Skillu:
Ich glaube der Code von bobobo zeigt ganz gut, was Ghosty1967 programmieren will.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

@bobobo...

Ahhhh, verstehe (fast alles)... aber wie und wo übergebe ich das Zeichen an eine bestimmte Anwendung und dort z.b. an ein Eingabefeld? :mrgreen:

@real
Rrriiichtig, ich muß wie bereits unten erwähnt dafür sorgen, das bei einer bestimmten Anwendung, das Komma des Zifferblocks als Punkt in ein Wertefeld (Eingabe) geschrieben wird. Ich könnte natürlich auch eine Keymap in der Registry anlegen, aber dann gilt die geänderte Tate für ALLE Anwendungen in XP und in Excel wiederum brauche ich auch das Komma...
(Ein Teufelskreis... :lol:)
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Dazu musst Du zwei Sachen miteinander kombinieren:
1. den von bobobo genannten Hook und
2. die Prüfung, welcher Prozess gerade aktiv ist.

Ich hab das Beispiel von Bobobo mal ein wenig erweitert, so dass nur im Notepad das Komma zum Punkt wird.

Code: Alles auswählen

Global hWindow,msg,hook 

#VK_OEM_PERIOD = $BE 

Structure KBDLLHOOKSTRUCT 
  vkCode.l 
  scanCode.l 
  flags.l 
  time.l 
  dwExtraInfo.l 
EndStructure 

Procedure.s FindWindowProcessName () 
  Protected snap.l, hwnd.l
  hwnd = GetForegroundWindow_()
  GetWindowThreadProcessId_ (hwnd, @pid) 
  NewList Process32.PROCESSENTRY32() 
  ClearList (Process32 ()) 
  snap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0) 
  If snap 
    Define.PROCESSENTRY32 Proc32 
    Proc32\dwSize = SizeOf (PROCESSENTRY32) 
    If Process32First_ (snap, @Proc32) 
      If pid = Proc32\th32ProcessID 
        ProcedureReturn GetFilePart (PeekS (@Proc32\szExeFile)) 
        LastElement (Process32 ()) 
      EndIf 
      While Process32Next_ (snap, @Proc32) 
        If pid = Proc32\th32ProcessID 
          ProcedureReturn GetFilePart (PeekS (@Proc32\szExeFile)) 
          LastElement (Process32 ()) 
        EndIf 
      Wend 
    EndIf    
    CloseHandle_ (snap) 
  EndIf
  ProcedureReturn "-" 
EndProcedure

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT) 
  If nCode = #HC_ACTION 
    If *p\vkCode = #VK_DECIMAL And LCase(FindWindowProcessName())="notepad.exe"
      If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN 
        keybd_event_(#VK_OEM_PERIOD, MapVirtualKey_(#VK_OEM_PERIOD,0), 0, 0) 
        ProcedureReturn 1 
      EndIf 
    EndIf 
  EndIf 
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p) 
EndProcedure 

Procedure AskForExit() 
  If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES 
     UnhookWindowsHookEx_(hook) : End 
  EndIf 
EndProcedure 

hook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@myKeyboardHook(),GetModuleHandle_(0),0) 
If hook = 0: End: EndIf 
hWindow     = OpenWindow(1,0,0,10,10,"k8D h00K",#PB_Window_Invisible) 

; by daniel, 21. Nov 2002 (german Tips&Tricks) 
  SystemPath$ = Space(1024) : GetSystemDirectory_(SystemPath$,1024) 
  hIcon       = ExtractIcon_(0,SystemPath$+"\user32.dll",1) 
;----- 

AddSysTrayIcon(1,WindowID(1),hIcon) 
SysTrayIconToolTip(1,"k8D h00K") 
msg = RegisterWindowMessage_("DKs_k8D_h00K") 

Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow : End 
    Case #PB_Event_Menu 
      If EventMenu() = 20 : AskForExit() : EndIf 
    Case #PB_Event_SysTray 
      If EventType() = #PB_EventType_LeftDoubleClick 
        AskForExit() 
      EndIf 
  EndSelect 
ForEver 
Gruß
René
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

:mrgreen: :lol: Der schiere Wahnsinn !

Danke real... mit dem Notepad klappt das wunderbar... ABER, das nächste Problem naht :shock:

Da das Eingabefeld, welches den Punkt empfangen soll in einem
Tochterfenster liegt, taucht dieses als Prozess natürlich im Taskmanager
nicht auf. Gibt es also die Möglichkeit, das Ziel nicht als Prozess, sondern
als Ziel über die Fensterüberschrift zu bestimmen?! Die Anwendung, welche im TM auftaucht heißt "tprun.exe" (TestPoint) aber auf dem
Desktop sieht das so aus
(Ich hoffe, man kann sich einen reim draus machen):

_|=Hauptfenster=================|
_|**********************************|
_|**********************************|
_|******|=Hauptfenster:winMessung================|
_|******|...........................................................................|
_|******|...........................................................................|
_|******|...........................................................................|
________|.......|-Hauptfenster:Manuelle Werteingabe-----|.......|
________|.......|##########################|.......|
________|.......|##########################|.......|
________|.......|###### EINGABEFELD #########|.......|
________|.......|##########################|.......|
________|.......|##########################|.......|
________|...........................................................................|
________|...........................................................................|
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

>a das Eingabefeld, welches den Punkt empfangen soll in einem
>Tochterfenster liegt, taucht dieses als Prozess natürlich im Taskmanager
>nicht auf. Gibt es also die Möglichkeit, das Ziel nicht als Prozess, sondern
>als Ziel über die Fensterüberschrift zu bestimmen?!
Ja geht, aber ist imo nicht zu empfehlen, da es immer mal vorkommen kann das ein anderes Fenster den selben Titel hat deshalb würd ich ne Kombination aus Fenstertitel & Prozess nehmen.
Hab zwar den Code oben selber nicht ganz verstanden, ABER man "muss nicht alle wissen, man muss nur wissen wo es steht" ;)

Code: Alles auswählen

If snap And FindWindow_(#Null, "Suchen")
Damit die Zeile

Code: Alles auswählen

If snap
in der Procedure.s FindWindowProcessName () ersetzen und schon haste nur bei der Suche "." statt ","
Antworten