mikrocontroller.net

Forum: PC-Programmierung Andere Fenster unter win32 und linux ansteuern


Autor: Florian Menne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hab folgende Frage: Ich möchte gerne andere Fenster mit meinem eigenen
Programm ansteuern, also so etwas wie simulierten Tastendruck folgende
Seite beschreibt es in VB:
http://www.bwir.de/sonstiges/visualbasicwinamp ,
möchte es aber gerne in c++ programmieren und zwar einmal für win32 und
einmal für suse linux. Wichtiger wäre mir erstmal für win32.
Frage ist jetzt nurnoch wie, hat einer eine Idee oder ein Beispiel?
Danke im Voraus!

Autor: Verdächtigter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, wie es für Windows geht, beschreibt bereits Dein VB-Code. Den nach C
bzw. C++ zu portieren, sollte Dir gelingen, schließlich ruft das auch
nur stinknormale Win32-API-Funktionen auf.

Das ist wirklich simpel.

Bei Linux solltest Du Dir die Dokumentation des jeweiligen
Fenstermanagers ansehen, vermutlich ist das, was Du suchst, da
beschrieben.

Autor: Florian Menne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut,
danke erstmal hab es schonmal geschafft das das Programm merkt ob
Winamp auf ist oder nicht. Dummerweise bleibe ich beim senden einer
message kleben!

Autor: Kritiker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersetze SendMessage durch PostMessage. SendMessage kehrt erst nach
Auswertung der Nachricht durch die Zielapplikation zurück, PostMessage
sofort.

Autor: Florian Menne (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nach längerem tüfteln und rätseln hab ich es endlich geschafft!
Trotzdem noch ein paar Fragen.
Ich habe aus der winuser.h dieses: "WINUSERAPI BOOL WINAPI
Beep(UINT);" gelöscht weil es ein Konflikt mit diesem hier gab:
"WINBASEAPI BOOL WINAPI Beep(DWORD,DWORD);" in der winbase.h ist dies
schlimm? Und dann noch eine Frage und zwar benutze ich in dem Sourcecode
eine while Schleife die endlos ist, leider geht dann die cpu last auch
auf 100%. Kann ich irgendwie ein interrupt schreiben, sodass das
Programm erst dann weiter auswetet sofern überhaupt etwas an den
Eingängen der Parallelen Schnittstlle geschieht?
Nochmals Danke!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dagegen kannst du so erst mal nichts machen.
Aber du kannst nett sein, und zwischendurch
immer mal etwas Rechenzeit abgeben.
Schau dir mal die Funktion Sleep() an.
Die gibt während der Wartezeit die CPU frei.

Autor: RAM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte? Du hast in Headerdateien, die nicht von Dir sind, sondern mit dem
Compiler mitgeliefert werden, irgendwelche Definitionen gelöscht?

Das ist ganz großer Murks. Sowas macht man nicht. Nie.

Deine Funktion Wait kann durch Sleep ersetzt werden.

Autor: Florian Menne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welcher Header kann ich den sleep finden ich benutze Dev-Cpp.
Zudem löschen oder ändern von headern: Erstmal war das sowieso komisch
beim ersten compilieren hat der nichts gesagt beim zweitenmal schon und
ich habe die gleiche syntax benutzt! Zudem bin ich ja nicht blöd, ich
habe schon ein Backup von den entsprechenden dateien gemacht und habe
sie nach dem kompilieren wieder hergestellt!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte in winbase.h sein

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wär's mit einer richtigen Message-Loop und Timern

timerP = SetTimer(NULL, NULL, milliseconds, timer);
while (GetMessage(...) > 0) {
  TranslateMsg(...);
}
KillTimer(NULL, timerP);

Autor: Florian Menne (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jo danke,
aber es funktioniert wunderbar mit Sleep die CPU Leistung ist unter
1%.
Dennoch bleibt eine Frage in der Header ist SendMessage so beschrieben:
SendMessageA(HWND,UINT,WPARAM,LPARAM); und in meiner source so:
SendMessage(FindWindow("Winamp v1.x", 0), 0x0111, 40045, 0);. Dies
würde bedeuten das für UINT 0x0111 eingetragen ist leider weiss ich
nicht wofür dies steht, da ich ehrlicherweise sagen muss das ich diesen
Codeabschnitt aus einem winamp Forum kopiert habe. Wobei wer soll daruf
kommen das da für UINT 0x0111 eingetragen werden muss den das war mein
Hauptfehler. Trotzdem würde ich es gern erfahren wofür es denn
zuständig ist.
Den sourcecode habe ich jetzt geändert und mit beigelegt vielleicht
kann ihn einer gebrauchen. Wie gesagt, ich habe temporär fürs
compilieren aus der winuser.h dieses hier gelöscht:WINUSERAPI BOOL
WINAPI Beep(UINT);, weil es ein Konflikt mit dem hier WINBASEAPI BOOL
WINAPI Beep(DWORD,DWORD); aus der winbase.h gab. Wieso weiss ich auch
nicht vielleicht ein Bug im compiler!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In die Windows Doku schauen!

Die Parameter zu SendMessage sind:
 * Das Fenster an die die Message geschickt wird
 * Die Message selbst (als Code)
 * Die Parameter für diese Message als WPARAM und LPARAM

So eine Message ist zb.

  WM_LBUTTONUP

und das bedeutet dass das Ereignis 'Linke Maustaste wurde
losgelassen' aufgetreten ist. Windows schickt diese Message
dann an das Fenster das unter der Maus liegt.
So eine Message ist natürlich nur ein Zahlencode und
irgendwo in den Windows-Headern wurde für so einen Zahlencode
ein 'sprechender Name' definiert

#define WM_LBUTTONUP   0x1234

Wenn man lang genug sucht, würde man wahrscheinlich auch
rausfinden, welche Message zum Code 0x0111 gehört, und
was das für eine Message ist.

Autor: Chris (grad nicht eingeloggt) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz Buchegger:
> Sollte in winbase.h sein

Wenn man jemandem, der noch nicht viel mit WinAPI zu tun hatte, so
etwas schreibt, sollte man IMHO immer auch erwähnen, dass man niemals
#include <winbase.h> schreiben sollte, sondern steht #include
<windows.h>. Nicht umsonst steht in der Doku durchweg:
> Declared in Winbase.h; include Windows.h.
(Hervorhebung von mir)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yep.

Ich hab die Sleep schnell in der MSDN nachgeschlagen
und dort war tatsächlich winbase.h angegeben.

Aber du hast natürlich recht. winbase.h wird
normalerweise nicht inkludiert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.