Autor Beitrag
Larus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 431



BeitragVerfasst: Di 13.11.07 14:23 
Hallo,

ich will in regelmäßigen Abständen einen Tastendruck wie z.B: F10 an eine Anwendung senden.
Dabei soll es egal sein, ob diese Anwendung im Vordergrund, minimiert oder im Hintergrund ist.

Wie ich generell einen Tastendruck sende weiß ich:

ausblenden Delphi-Quelltext
1:
2:
keybd_event(VK_F10, 000);
keybd_event(VK_F10, 0, KEYEVENTF_KEYUP, 0);


Von der Anwendung weiß ich nur den Titel wie er auch über dem Fenster / in der Taskleiste steht.
Diesbezüglich habe ich etwas wie folgendes gefunden:
ausblenden Delphi-Quelltext
1:
FindWindow('Der Titel des Fensters hier',nil)					


Ich will die Anwendung für das senden des Tastendruckes nicht in den Vordergrund holen.

Meine Frage ist nun... kann ich beides kombinieren? Und wenn ja wie?

Es wäre nett wenn Ihr mir weiterhelfen könntet. Die einzigen Möglichkeiten die ich bei Google gefunden habe waren eine Kombination aus "Fenster nach vorne holen" und "wieder nach hinten bringen" aber genau das will ich ja nicht.

Danke schonmal im Voraus,

Dominik

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 14.11.07 10:59 
Um Deine Frage zu beantworten, müssen wir noch wissen, wie es mit der Ziel-Anwendung, die die F10-Taste gesendet bekommt, ausschaut. Ist es eine mit Delphi erstellte Anwendung, ist das Problem möglicherweise leicht lösbar.

Handelt es sich aber um eine Fremd-Anwendung, dann ist die Frage wichtig, ob die Anwendung Tastatur-Messages überhaupt auswertet, denn die meisten Programme tun das nicht, wenn sie nicht den Focus haben (warum sollten sie auch).

Ich habe mich vor kurzem erst mit genau dieser Problematik beschäftigt und es ging aus genau diesem Grund in die Hose.

Ist die Ziel-Anwendung allerdings in Delphi (möglicherweise selbst) geschrieben, dann sollte es reichen, das Handle der Anwendung über FindWindowEx herauszufinden (über den Programmtitel). Innerhalb der Ziel-Anwendung müssen dann mit ApplicationEvents die Tastaturmessages abgefangen und entsprechend ausgewertet werden.

Ich tippe aber auf Fremdanwendung.

Was soll überhaupt passieren - vielleicht lässt sich die ganze Problematik anders lösen...

_________________
Es gibt keine Probleme - nur Lösungen!
Larus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 431



BeitragVerfasst: Mi 14.11.07 11:39 
also es handelt sich um eine fremdanwendung soweit war das schonmal richtig...
ich habe keinen Peil in welcher Sprache diese Anwendung geschrieben wurde.

Ich habe mir eine Art Timersystem gebastelt das für alle Funktionstasten von F1 bis F10 keystrokes in definierbaren Zeitabständen sendet. In der Fremdanwendung werden dadurch verschiedene Prozesse aktiviert.
Bisher klappt das ganze eigtl. nur wenn die Fremdanwendung auch definitv "vorne" ist und aktiv ist.
Das soll nun umgeschrieben werden, sodass ich die Anwendung laufen lassen kann und deren Prozesse, und ich dabei dann in ruhen arbeiten kann (z.B.). Das ist auch der Grund warum ich das mit dem "Nach vorne holen" und wieder "nach hinten bringen" nicht machen will, da mich das bei meinen sonstigen Arbeiten stören könnte...
Den PC über Nacht laufen lassen will ich dafür nämlich eigtl. nicht.
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mi 14.11.07 11:59 
Ich sitze gerade nicht zu Hause. Aber ich meine, dass es einen Befehl gibt, das Neuzeichnen von verschiedenen Fenstern (oder auch vom Desktop an sich?) für eine Zeit lang zu unterbinden. Dann könntest du das Fenster in der Zeit in den Vordergund holen, die Message senden und dann wieder verstecken. Anschließend hebst du die "Malsperre" auf. Ich weiß aber wie gesagt im Moment nicht, wie die Befehle nochmal lauten.

Allerdings ist das eher die quick&dirty Lösung...

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Larus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 431



BeitragVerfasst: Mi 14.11.07 12:35 
hm...
dan könnt ich das ganze auch dierekt soo laufen lassen.
Es wäre ein wenig störend wenn ich z.B. am Programmieren bin und auf einmal kommt dieses Fenster in den Vordergrund... die Tasten die ich in der Zwischenzeit drücke weil ich eigtl. am Programmieren bin könnten bei der Fremdanwendung wieder andere Effekte hervorrufen. Das war auch der Grund warum ich das Fenster minimiert lassen wollte.

Gruß Dominik
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 14.11.07 14:53 
Zitat:
Das soll nun umgeschrieben werden, sodass ich die Anwendung laufen lassen kann und deren Prozesse, und ich dabei dann in ruhen arbeiten kann (z.B.).

Ja, das ist ein guter Ansatz. Du siehst ja, allem Anschein wertet die Anwendung die (immer ankommenden!) Tastaturmessages einfach nicht aus. Aber wenn das Umprogrammieren möglich ist, dann ist das ein guter Weg (für Dich).
Wie gesagt mit FindWindowEx kannste das Fenster der Anwendung dann rausfinden und die Keystrokes über das Handle schicken.

_________________
Es gibt keine Probleme - nur Lösungen!
Larus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 431



BeitragVerfasst: Mi 14.11.07 20:13 
wie muss ich das ganze denn dann umschreiben?
wo muss ich das dann einfügen den handel?

(keybd_event(VK_F10, 0, 0, 0);) wo hier?
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Do 15.11.07 10:54 
Nee, über den schönen kbdevent geht das eben nur mit dem auf-Vordergrund-setzen, deswegen eben weil man damit ja auch kein Handle übergeben kann.

Aber wenn Du hier guckst, kommste sicher weiter

www.delphi-forum.de/...tendruck+postmessage

Du musst quasi die Taste gedrückt-Nachricht und die Taste loslassen-Nachricht selbst schicken über postmessage.

Um das Handle der Anwendung zu finden, suchen unter:

www.delphi-forum.de/...ghlight=findwindowex

Jetzt musste das ganze nur noch miteinander verbinden. :-)

_________________
Es gibt keine Probleme - nur Lösungen!