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


von Florian Menne (Gast)


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!

von Verdächtigter (Gast)


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.

von Florian Menne (Gast)


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!

von Kritiker (Gast)


Lesenswert?

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

von Florian Menne (Gast)


Angehängte Dateien:

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!

von Karl H. (kbuchegg)


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.

von RAM (Gast)


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.

von Florian Menne (Gast)


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!

von Karl H. (kbuchegg)


Lesenswert?

Sollte in winbase.h sein

von arc (Gast)


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);

von Florian Menne (Gast)


Angehängte Dateien:

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!

von Karl heinz B. (kbucheg)


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.

von Chris (grad nicht eingeloggt) (Gast)


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)

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.