Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi API Tastaturhooks Problem (https://www.delphipraxis.net/33008-api-tastaturhooks-problem.html)

DarkLord0 31. Okt 2004 12:46


API Tastaturhooks Problem
 
hallo
ich bin dabei eine anwendung mit Borland Delphi 6 zu programmieren, bei der der user die möglichkeit haben soll, durch schnelltasten, bestimmte aktionen durchzuführen, auch wenn das programm gerade nicht aktiv, also minimiert, im tray oder sonstwo ist.
dazu muss ich wohl Windows API Hooks verweden. ich habe mir dazu bereits ein paar tutorials durchgelesen und die entsprechenden funktionen (Hook/Unhook) in eine DLL ausgelagert; das ganze funktioniert auch schon, allerdings treten dabei gewisse unschöne probleme auf, die es bei anderen programmen, die offensichtlich auch Hooks verwenden, nicht gibt.
und zwar sollen das ganze auch funktionieren wenn das system durch andere anwendungen belastet ist wie z.B. wenn ein spiel an ist.
und zwar wenn ich einen keyboardhook installieren lasse vom programm durch die DLL dann ist dieser so eingestellt ist, dass er auf alle tastatursignale reagiert und mit SendMessage oder PostMessage eine Nachricht an das Hauptprogramm schickt.
die nachricht empfange ich im hauptprogramm mit
(SendMessage) WndProc(var Mess:TMessage);
(PostMessage) Application.OnMessage
Mit SendMessage funktioniert es, das system ruckelt aber kurz.
Mit PostMessage funktioniert es generell auch, aber wenn das system stärker ausgelastet ist (also wenn ein spiel an ist) dauert es lange (bis zu 30 sek) bis das signal ankommt bzw bis das programm reagiert (es reagiert mit einem audio signal).

Ich weiß nicht ob man es nur mit SendMessage bzw PostMessage hinbekommen kann dass es einwandfrei funktioniert und weiß auch nicht woher die jeweiligen probleme kommen...vielleicht wartet das sytem bei sendmessage bis die nachricht da ist und ruckelt deswegen...

meine frage : kann man das problem generell so einfach lösen (also ohne verwendung von MMF o.ä.)?
und wenn nicht : wo finde ich tutorials für MMF in delphi ?
TIA

mirage228 31. Okt 2004 12:50

Re: API Tastaturhooks Problem
 
Hi,

wenn du SendMessage aufrufst, kehrt SendMessage erst wieder zu dem aufrendem Block zurück, wenn die Anweisung komplett abgearbeitet wurde. PostMessage hingegen kehrt sofort nach Abschicken zurück.

Falls Du PostMessage verwendest, könntest Du die Priorität von Deinem Programm höher ansetzen, sodass die Nachrichten eventuell schneller ankommen.

mfG
mirage228

P.S.: Herzlich Willkommen in der DP :)

c113plpbr 31. Okt 2004 12:52

Re: API Tastaturhooks Problem
 
Lass das mit den Hooks, das geht viel einfacher: mit RegisterHotKey
Für beispiele such mal hier in der DP, da sollte es einiges geben.

ciao, Philipp

PS: Herzlich Willkommen in der DP!

DarkLord0 31. Okt 2004 17:32

Re: API Tastaturhooks Problem
 
danke schonmal
ich hab das mal mit den hotkey funktionen ausprobiert, allerdings habe ich da noch ein problem:
wenn eine taste als globaler hotkey für mein programm definiert ist, kann sie bei anderen programmen garnicht verwendet werden. (?)
falls das mit hotkeys nicht funktioniert : wie erhöhe ich denn die priorität meiner anwendung?

und noch etwas: ich suche eine gute komponente o.ä. mit der ich audio dateien mit einer bestimmten lautstärke (in prozent der lautstärke der datei) abspielen lassen kann. ich habe da schon etwas ("Wave Audio Package"), aber das macht dann auch wieder bei höherer systemauslastung probleme... das gehört jetzt wohl hier nicht rein aber weiß ja trotzdem hier jemand was dazu

Christian Seehase 31. Okt 2004 21:27

Re: API Tastaturhooks Problem
 
Moin Darklord,

Zitat:

Zitat von Darklord0
wenn eine taste als globaler hotkey für mein programm definiert ist, kann sie bei anderen programmen garnicht verwendet werden. (?)

Ein Hotkey kann nur einmal registriert werden, wobei auch noch die Regel gilt: Wer zuerst kommt mahlt zuerst.
Sollte also ein anderes Programm den gewünschten Hotkey bereits belegt haben, hast Du keine Chance.

Zitat:

Zitat von Darklordß
und noch etwas:...

Hier gilt die Regel: Neue Frage - Neuer Thread.
Mach' dafür also bitte einen neuen Thread auf.
Danke.

DarkLord0 31. Okt 2004 23:12

Re: API Tastaturhooks Problem
 
Zitat:

Zitat von Christian Seehase
Ein Hotkey kann nur einmal registriert werden, wobei auch noch die Regel gilt: Wer zuerst kommt mahlt zuerst.
Sollte also ein anderes Programm den gewünschten Hotkey bereits belegt haben, hast Du keine Chance.

ne, ich meinte das eigentlich so : wenn mein programm sich den hotkey registriert, hat diese taste in anderen programmen (z.B. notepad.exe) keine funktion/auswirkung mehr

c113plpbr 1. Nov 2004 09:30

Re: API Tastaturhooks Problem
 
Zitat:

Zitat von DarkLord0
ne, ich meinte das eigentlich so : wenn mein programm sich den hotkey registriert, hat diese taste in anderen programmen (z.B. notepad.exe) keine funktion/auswirkung mehr

Das ist richtig. Das selbe problem hatte ich auch ... naja, und manchmal ist da eine einfachere, dafür dümmere lösung besser: Hotkey "deaktivieren" und tastendruck simulieren ... ;)

ciao, Philipp

DarkLord0 1. Nov 2004 12:43

Re: API Tastaturhooks Problem
 
naja, vielleicht ist das mit hotkeys sowieso nicht das richtige.
ich müsste dann nämlich auch einfache buchstabentasten als hotykeys registrieren und da kann es ja wahrscheinlich immer mal sein dass die schon ein anderes programm hat (auf irgendeinem rechner).
deswegen nochmal zu der postmessage variante : wie kann ich denn die priorität meiner anwendung erhöhen?
und wären memory mapped files (über die ich bis jetzt nicht viel weiß) denn in der lage so einfache sachen wie postmessage oder sendmessage zu ersetzen oder "lohnt" sich das nur beim schicken größerer datenmengen?

DarkLord0 6. Nov 2004 00:08

Re: API Tastaturhooks Problem
 
tja, postmessage mit höherer priorität ausprobiert, ergebnis : es kommt wieder zu rucklern in anderen programmen.
noch jmd eine idee?

c113plpbr 6. Nov 2004 12:44

Re: API Tastaturhooks Problem
 
Du könntest es auch mal über die SendIpcMessage-Funktion aus der MadCodeHook-Lib versuchen ... ich denke, dass diese funktion das packen könnte ... MadCodeHook ist ein bestandteil der MadCollection die unter http://www.madshi.net/ zum download angeboten wird.

ciao, Philipp

DarkLord0 7. Nov 2004 01:05

Re: API Tastaturhooks Problem
 
ich hab das mal mit der MadCodeHook-Lib getestet. Es schien auch erst ganz gut zu funktionieren. nur gibt es das problem dass manchmal programmfehler auftreten, die daher kommen dass windows irgendwie die nachricht falsch überbringt...
im manual steht dazu
"
CAUTION: When using the default parameters each IPC message is handled by a seperate thread, as a result your handler will be called in the context of a different thread each time. This is has some advantages and some disadvantages. One problem is that when using multiple threads Windows' time scheduler will do whatever it likes. This may result in that the order of the incoming messages is slightly different to how they were sent. If that is a problem for you, please use "CreateIpcQueueEx" and specifiy a maximum thread count of "1". This will make sure that the order of the messages stays the same.
"
wenn ich allerdings den Thread Count auf 1 setze, habe ich wieder das problem was ich vorher mit postmessage hatte nämlich dass der zu lange braucht bis die nachricht ankommt womit ich mich im kreis drehe :(
außerdem kann man nur 1 oder unendlich als thread count verwenden

c113plpbr 7. Nov 2004 07:29

Re: API Tastaturhooks Problem
 
Hmm ... zuviel werden sollte es natürlich trotzdem nicht ... generell hat madshi sich zu diesem thema meines wissens nach schon öfter in seinem forum geäußert, wie z.B. hier
Vielleicht geht das ja doch irgendwie mit MMF ... nur frag mich nicht wie ... ;)

ciao, Philipp

DarkLord0 7. Nov 2004 13:21

Re: API Tastaturhooks Problem
 
naja, soviele sind das nicht...
jedesmal wenn eine taste gedrückt wird, allerdings nicht mehr als 10/sekunde

edit: ich hab es jetzt mehr oder weniger hingekriegt dass der falsche msg fehler keine auswirkungen mehr hat. allerdings liefert das programm jetzt häufig "Unhandled Exceptions" :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz