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

Beitrag von Ghosty1967 »

Danke, werde ich morgen mal ausprobieren... jetzt ist erstma FEIERABEND !
:mrgreen: :D :mrgreen: :lol:
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Der Tipp von D@nte wird nicht funktionieren... Schon weil er den Code garnicht verstanden hat. :wink: 1. Wird bei "if snap" nur geprüft, ob ein Snapshot der Prozesse gemacht werden konnte und 2. sucht ein "FindWindow" nur nach einem Fenster mit bestimmtem Titel, das Fenster muss aber nicht aktiv sein (kann also im Hintergrund liegen).

Ich kann's hier auf dem Notebook ohne Ziffernblock zwar nicht testen, aber versuch mal diesen Code:

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.b FindWindowProcessName (exename.s, title.s) 
  Protected snap.l, hwnd.l, wndname.s 
  hwnd = GetForegroundWindow_() 
  wndname = ""
  GetWindowText_(hwnd,@wndname,255)
  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 And GetFilePart(PeekS(@Proc32\szExeFile)) = exename And wndname = title
        ProcedureReturn #True 
        LastElement (Process32 ()) 
      EndIf 
      While Process32Next_ (snap, @Proc32) 
        If pid = Proc32\th32ProcessID And GetFilePart(PeekS(@Proc32\szExeFile)) = exename And wndname = title
          ProcedureReturn #True
          LastElement (Process32 ()) 
        EndIf 
      Wend 
    EndIf    
    CloseHandle_ (snap) 
  EndIf 
  ProcedureReturn #False 
EndProcedure 

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT) 
  If nCode = #HC_ACTION 
    If *p\vkCode = #VK_DECIMAL And FindWindowProcessName("notepad.exe","test.txt - Editor") 
      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

Theoretisch sollte jetzt nur ein Punkt erscheinen, wenn Du den Editor startest und eine Datei test.txt bearbeitest. Testen kann ich das auch erst morgen...
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

[IRONIE]
>Der Tipp von D@nte wird nicht funktionieren... Schon weil er den Code garnicht verstanden hat.
*trotzig* Der geht wohl!
[/IRONIE]

>2. sucht ein "FindWindow" nur nach einem Fenster mit bestimmtem Titel, das Fenster muss aber nicht aktiv sein (kann also im Hintergrund liegen).
Ok das wußte ich wiederum noch nicht *wieder was gelernt*

>Ich kann's hier auf dem Notebook ohne Ziffernblock zwar nicht testen
*kopfkratz* Haste keine NUM-Taste auf'em Laptop?! Womit du Die Tasten

Code: Alles auswählen

7 8 9 0
U I O P
J K L Ö
M   : _
zu nem Nummernblock ummodelst, oder sollte das gar nen unterschied zu nem seperaten Nummernblock machen?

>Theoretisch sollte jetzt nur ein Punkt erscheinen, wenn Du den Editor startest und eine Datei test.txt bearbeitest.
Ja geht aber auch nur wenn die Datei "test.txt" heißt, sobald man es mit einer Datei "tes t.txt" versucht be2600ste be5 de5ne0 C6de nen 50a 5n Ze53e 39,,,
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Ich klemm mir das mit den Zitaten jetzt mal... Das mit der Num-Taste funktioniert tatsächlich selbst auf dem Gericom-Notebook von meiner besseren Hälfte. Danke für den Tipp, auch wieder was dazugelernt... :D

Ich hab in dem Code eine doppelte Prüfung drin: exe-Name und Fenstername des aktuellen Fensters müssen mit der Vorgabe übereinstimmen. Eigentlich muss Ghosty in den Code nur noch den Namen seiner Exe und den Titel des Fensters ändern und schon sollte es so funktionieren, wie er es braucht.

P.S. Funktioniert auch hier, wenn man's als notepad.exe kompiliert...:

Code: Alles auswählen

OpenWindow(0,0,0,300,200,"test.txt - Editor") : CreateGadgetList(WindowID(0)) : EditorGadget(0,0,0,300,200) : LoadFont (0, "Courier", 15) : SetGadgetFont(0, FontID(0)) : Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Antworten