Foro | | | | - Page 1 - |
|  Julian Schmidt | Ciao, ich bin auf der Cerca nach einen Hotkey-Edit das so gut wie alle Scankeys untestützt.
Def CreateHotkeyEdit(5) Control("msctls_hotkey32","",$54010200,&(2),&(3),&(4),&(5),&(1),2000,%hinstance)
Def SetHotKey(3) SendMessage(&(1),1025,MakeWord(%(2),%(3)),0)
Def GetHotKey(1) SendMessage(&(1),1026,0,0)
Def GetKey(1) LoWord(Lobyte(SendMessage(&(1),1026,0,0)))
Def GetModifyer(1) LoWord(Hibyte(SendMessage(hk&,1026,0,0)))
Def MakeWord(2) (%(1) & $FF) | ((%(2) & $FF) << 8)
Def HiByte(1) %(1) >> 8
Def LoByte(1) %(1) & $FF
WindowTitle "Tastenkombinationionen"
Cls
Var hk& = CreateHotkeyEdit(%hwnd,300,10,250,24)
SetHotKey(hk&,65,4)
While 1
SetFocus(hk&)
WaitInput
Cls
Print "Du hast eingegeben: "
Print
Print "Taste ", GetKey(hk&)
Print "Modifyer ", GetModifyer(hk&)
EndWhile
In dem Beispiel kann das Eingabe-Feld z.B. nicht mit Druck umgehen.
Saluto |
| | | | |
| | | | - Page 2 - |
|  | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | - Page 4 - |
|  Julian Schmidt |  Wow, mit dem Edit bekommt man wirklich alle Kombinationen hin. Danke iF. Klasse Sache.
Hier nochmal mit Erkennung aller Tasten und Readonly-Edit
{$iq}
declare Edit&,kbdlist&
windowstyle 16
cls
userMessages wm_user+1234
Edit& = @Create("Edit", %hWnd, "", 10, 10, 200, 24)
SendMessage(Edit&,$00CF,1,0)
kbdlist&=createKbdList()
initMyHook()
do{
waitInput
}
nProc initMyHook{
return SetWindowsHookEx(13,procAddr(myLowLevelKeyboardHookProc),getModuleHandle(0),0)/*WH_KEYBOARD_LL*/
}
nProc myLowLevelKeyboardHookProc(long code,wp,lp){
global edit&,kbdlist&
ifnot long(lp,8)==128 {
code=long(lp,0)
string mor
ifnot code>159 or code==16 or code==17 or code==18 {
case iskey(vk_shift) : mor=mor+"Shift + "
case iskey(vk_control) : mor=mor+"Strg + "
case iskey(vk_menu) : mor=mor+"Alt + "
}
setText(edit&,mor+substr(getString(kbdlist&,selectString(kbdlist&,0,str(code))),2," "))
}
CallNextHookEx(0, Code, wp, lp)
}
nProc selectString(long lb,srcFrom,string src){
return sendMessage(lb,lb_selectString,srcFrom,src)
}
createKbdList{
long kbdList=create("list",0)
addString(kbdList,"8 BackSpace")
addString(kbdList,"9 Tab")
addString(kbdList,"12 Entfernen")
addString(kbdList,"13 Return")
addString(kbdList,"16 Shift")
addString(kbdList,"17 Strg")
addString(kbdList,"18 Alt")
addString(kbdList,"19 Pause")
addString(kbdList,"20 Caps")
addString(kbdList,"27 Esc")
addString(kbdList,"32 Space")
addString(kbdList,"33 BildHoch")
addString(kbdList,"34 BildRunter")
addString(kbdList,"35 Ende")
addString(kbdList,"36 Pos1")
addString(kbdList,"37 Links")
addString(kbdList,"38 Hoch")
addString(kbdList,"39 Rechts")
addString(kbdList,"40 Runter")
addString(kbdList,"41 Select")
addString(kbdList,"42 Druck")
addString(kbdList,"43 Execute")
addString(kbdList,"44 Druck")
addString(kbdList,"45 Einfg")
addString(kbdList,"46 Entf")
addString(kbdList,"47 Hilfe")
addString(kbdList,"48 0")
addString(kbdList,"49 1")
addString(kbdList,"50 2")
addString(kbdList,"51 3")
addString(kbdList,"52 4")
addString(kbdList,"53 5")
addString(kbdList,"54 6")
addString(kbdList,"55 7")
addString(kbdList,"56 8")
addString(kbdList,"57 9")
addString(kbdList,"65 A")
addString(kbdList,"66 B")
addString(kbdList,"67 C")
addString(kbdList,"68 D")
addString(kbdList,"69 E")
addString(kbdList,"70 F")
addString(kbdList,"71 G")
addString(kbdList,"72 H")
addString(kbdList,"73 I")
addString(kbdList,"74 J")
addString(kbdList,"75 K")
addString(kbdList,"76 L")
addString(kbdList,"77 M")
addString(kbdList,"78 N")
addString(kbdList,"79 O")
addString(kbdList,"80 P")
addString(kbdList,"81 Q")
addString(kbdList,"82 R")
addString(kbdList,"83 S")
addString(kbdList,"84 T")
addString(kbdList,"85 U")
addString(kbdList,"86 V")
addString(kbdList,"87 W")
addString(kbdList,"88 X")
addString(kbdList,"89 Y")
addString(kbdList,"90 Z")
addString(kbdList,"96 0")
addString(kbdList,"97 1")
addString(kbdList,"98 2")
addString(kbdList,"99 3")
addString(kbdList,"100 4")
addString(kbdList,"101 5")
addString(kbdList,"102 6")
addString(kbdList,"103 7")
addString(kbdList,"104 8")
addString(kbdList,"105 9")
addString(kbdList,"106 *")
addString(kbdList,"107 +")
addString(kbdList,"109 -")
addString(kbdList,"110 ,")
addString(kbdList,"111 /")
addString(kbdList,"112 F1")
addString(kbdList,"113 F2")
addString(kbdList,"114 F3")
addString(kbdList,"115 F4")
addString(kbdList,"116 F5")
addString(kbdList,"117 F6")
addString(kbdList,"118 F7")
addString(kbdList,"119 F8")
addString(kbdList,"120 F9")
addString(kbdList,"121 F10")
addString(kbdList,"122 F11")
addString(kbdList,"123 F12")
addString(kbdList,"124 F13")
addString(kbdList,"125 F14")
addString(kbdList,"126 F15")
addString(kbdList,"127 F16")
addString(kbdList,"128 F17")
addString(kbdList,"129 F18")
addString(kbdList,"130 F19")
addString(kbdList,"131 F20")
addString(kbdList,"132 F21")
addString(kbdList,"133 F22")
addString(kbdList,"134 F23")
addString(kbdList,"135 F24")
addString(kbdList,"160 Shift")
addString(kbdList,"161 Shift")
addString(kbdList,"162 Strg")
addString(kbdList,"163 Strg")
addString(kbdList,"164 Alt")
addString(kbdList,"165 Alt")
return kbdList
}
|
| | | | |  |
| |  Julian Schmidt | Nichts, nur geht laut deiner Aussage dieses nicht. Nur per XPSE oder Registerhotkey in einer Schleife, was bei mehreren Edits aber potenziell problematisch ist.
iF (23.01.13)
iF (23.01.13)Mach doch nicht so kompliziert sondern einfach ein readonly Edit gefüllt mit allem was bei getfocus ein globaler Tastaturhook abliefert. Direkt befüllen mit Einträgen aus solch Liste: [...] [...]  Julian Schmidt (23.01.13)Wie meinst du das mit einen globalen Tastatur Hook. Kannst du ein Beispiel mit reinen XProfan geben.
iF (23.01.13)Absturzsicher geht das mit reinem Profan nicht - absturzsichere Hooks waren mit ein Grund per nProcs: [...] 
[OFFTOPIC]Wenn man mehrere Zitate verschachtelt, werden die Parameter von den ersten inneren Zitat an das außere Zitat übertragen.[/OFFTOPIC] |
| | | | |
| |  | Ich hab Dir doch oben geschrieben wie Du die Drucktaste rein mit XProfan abfangen kannst und alle anderen Tasten per HotKey.
Meine Antwort, das es nur mit XPSE absturzsicher geht, bezog sich auf Deine Frage nach Tastatur-Hook. Nicht verwirren lassen!  |
| | | | |
| |  Julian Schmidt | Ok, war wirklich etwas verwirrend. Kannst du nochmal genauer beschreiben wie? |
| | | | |
| |  | Hier ist doch ein nicht-xpse-Code dabei der zeigt wie man diese Taste abfängt: [...] 
Andere Tasten kannst Du auch per addHotKey abfangen.
So müsstest Du doch alle Tasten abfangen können. |
| | | | |
| |  Julian Schmidt | Dann müsste ich also alle in un Schleife hauen. Da größte Problem ist, das ich per jeden Hotkey die Möglichkeiten Strg, Alt, Shift, Strg+Alt, Strg+Shift, Alt+Shift, Strg+Alt+Shift + Hotkey brauche. Dann bin ich mal ganz schnell bei 500 Schleifendruchläufen mit Addhotkey Mal eine andere Frage, warum die Druck-Taste nicht per Addhotkey. Bzw. warum nicht alle per RegisterHotKey? |
| | | | |
| |  | Wenn Du addHotKey verwenden möchtest dann musst Du einmalig alle registrieren.
Besser wäre imho eine kleine hookProc die gleich diese Tasteninfos z.B. per userMessage an das XProfan-Programm absendet sodass das Programm quasi nur noch einsammeln und reagieren muss. Das Beispiel dazu ist ja auch hier [...] abrufbar - also das ist der erste Quelltext. Da bekommst quasi gleich zur Message die Tasteninfo mitgeliefert.
Damit solch Code jedoch 100% absturzsicher funktioniert und Dein XProfan-Programm nicht durcheinander bringt, ist es notwendig, dass die Hook-Proc nicht auf eine interpretierte Proc zeigt, weil XProfan nicht apc-sicher ist. Das man als XProfaner in den Genuss solcher Funktionen kommen kann ohne dass das Programm abstürzt, war mit ein Grund per n(ative)Procs, die eben genau sowas ermöglichen und thread sowie apc-sicher sind. Der Gedanke war halt, dass man auch solche Dinge mit seiner Lieblingsprogrammiersprache (XProfan) programmieren kann und die nProcs ermöglichen halt das man eben per sowas nicht auf eine andere Programmiersprache zurückgreifen muss sondern man wie gewohnt xprofant.
Für nProcs einfach xpse mit ins Kompilerverzeichnis kopieren und in der IDE als Kompiler oder Werkzeug angeben, Aufruf einfach xpse file - in den Kopf der xprf einfach {$cleq} (kompilieren, linken, exe, quiet) schreiben und schon flitzt das Programm.
|
| | | | |
| |  Julian Schmidt | Ok, werde mir mal anschauen. Evtl. auch in Kombination mit XPSE.
[OFFTOPIC]War gerade auf deiner der XPSE-Webseite [...]  . Oben steht Copyright © 1998-2011 XProfan.Com, built DE. Tatsächlich schreiben wir schon das Jahr 2013  [/OFFTOPIC] |
| | | | |
| |  Julian Schmidt | Ich will das Beispiel mit Hook nochmal aufgreifen. [...]  Dort existiert die Zeile:
Bei &uwParam handelt sich um den Virtuellen Tastecode / Scankey. Wobei handelt es bei &ulParam. Dachte erst es handelt sich um den Modifier, dem schein allerdings nicht so zu sein!? Wie kann ich einen Modifier, etwa Alt, mit abfragen. |
| | | | |
| |  | Schau die nProc wandelt die Hook-Calls in SendMessage um, diese wiederum empfängt das XProfan-Programm als UserMessages.
sendMessage(hWnd,wm_user+1234,long(lp,0),long(lp,8))
Windows sendet 3 Params an die Hookproc: (long code,wp,lp) [...] 
lParam [in]. Type: LPARAM, A pointer to a KBDLLHOOKSTRUCT structure: [...] 
Demnach hole ich mit long(lp,0): vkCode, Type: DWORD, A virtual-key code: [...] 
und mit long(lp,8): flags,Type: DWORD, The extended-key flag, event-injected flag: [...] 
Demnach steht die von Dir gewünscht Info nirgends bzw. wird sie separat als Nachricht zuvor gesandt, also z.B. wenn alt oder strg gedrückt wurde. Du müsstest demnach selbst "merken" ob eine der Tasten zuvor gedrückt o. losgelassen wurde. Ob losgelassen oder gedrückt steht in &ulParam.
Da wäre es per Deinen Fall vielleicht besser, wenn Du in der nProc was änderst und statt per &lParam im SendMessage nicht long(lp,8) sendest sondern gleich mit isKey ( [...] ) ermittelte Werte sendest und dafür vielleicht auf die Info verzichtest, ob die Taste gedrückt oder losgelassen wurde.
Also vlt. so:
{$cleq}
windowstyle 16
cls
userMessages wm_user+1234
initMyHook()
do{
waitInput
select uMessage
caseof wm_user+1234
print &uwParam,&ulParam
endSelect
}
nProc initMyHook{
return SetWindowsHookEx(13,procAddr(myLowLevelKeyboardHookProc),getModuleHandle(0),0)/*WH_KEYBOARD_LL*/
}
nProc myLowLevelKeyboardHookProc(long code,wp,lp){
casenot long(lp,8) : casenot (long(lp,0)==162) : sendMessage(hWnd,wm_user+1234,long(lp,0),iskey(VK_CONTROL)*2+iskey(VK_MENU))/* wenn Taste gedrückt statt losgelassen *//* nicht übermitteln wenn nur die strg taste gedrückt */
CallNextHookEx(0, Code, wp, lp)
}
|
| | | | |
| |  Andreas Miethe
 | Hallo David,
auf diese Art blockierst Du z.B. mein Snapshot-Programm. Besser die Meldung weitergeben.
nProc myLowLevelKeyboardHookProc(long code,wp,lp){
sendMessage(hwnd,wm_user+1234,long(lp,0),long(lp,8))
CallNextHookEx(0, Code, wp, lp)
|
| | | XProfan X2Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...]  | 19.02.2013 ▲ |
| |
| |  | Stimmt, danke, mein Fehler.
Ich korrigiere das auch gleich mal hier: [...]  |
| | | | |
| |  Julian Schmidt | Beim Ausführen deines Quelltextes [...] kommt eine Warnung. Kann ich diese Überspringen oder wie bekomme ich diese Entfernt, um den Quelltext auszuführen?
iF (19.02.13)
Da wäre es per Deinen Fall vielleicht besser, wenn Du in der nProc was änderst und statt per &lParam im SendMessage nicht long(lp,8) sendest sondern gleich mit isKey ( [...] ) ermittelte Werte sendest und dafür vielleicht auf die Info verzichtest, ob die Taste gedrückt oder losgelassen wurde.
Dann müsste ich mir aber immernoch die vorhergedrückten Tasten merken, oder? |
| | | | |
|
AnswerTopic-Options | 46.371 Views |
ThemeninformationenDieses Thema hat 3 subscriber: |