Forum: PC-Programmierung Exe im Hintergrund


von Xenon (Gast)


Lesenswert?

Hallo!
Ihc möchte gerne eine exe die mit C oder auch Quickbasic geschrieben
wurde nur im Hintergrund ausführen lassen. Das heißt, dass sie sich
beim Systemstart öffnet man es aber nicht sehen kann. Diese exe soll
nähmlich
ein LCD ansteuern.
Mfg Xenon

von Jens (Gast)


Lesenswert?

Du könntest ein normales Programm mit Fensteroberfläche schreiben und
dies anschließend mit ShowWindow(hWnd, SW_HIDE) verstecken. ShowWindow
ist eine Windows API Funktion, hWnd das Fensterhandle. Mit C bzw. C++
sollte das problemlos gehen, welche Möglichkeiten Quickbasic bietet,
weis ich leider nicht.

Infos zur Funktion:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/showwindow.asp

Jens

von Xenon (Gast)


Lesenswert?

Danke für die schnelle Antwort!
Welche Datei muss ich einbinden? Weil wenn ich das so in den Compiler
schreibe meckert der nur...

von Thomas P. (Gast)


Lesenswert?

ShowWindow(hWnd, SW_HIDE)

Das hWnd darfst Du so nicht schreiben! Schaue Dir den Link von Jens an!

von Xenon (Gast)


Lesenswert?

Wie soll man es denn schreibe?

von Philipp Karbach (Gast)


Lesenswert?

du musst windows.h einbinden und dann aber auch eine WinMain function
anstatt der normalen main function nehmen:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nShowCmd)

{
HWND hwnd;

ShowWindow(hwnd, SW_HIDE);

// dein LCD "quatsch" :)

return 0;
}

glaub das geht so, ansonsten musst du das hwnd noch mit CreateWindow
initialisieren aber ich weiß nicht genau ob man das MUSS. du willst ja
gar kein fenster haben.

von Christoph _. (chris)


Lesenswert?

> ansonsten musst du das hwnd noch mit CreateWindow
> initialisieren aber ich weiß nicht genau ob man das MUSS

Man muss. Nicht initialisierte lokale Variablen enthalten in C
beliebigen Müll, aber auf keinen Fall ein gültiges Window-Handle.

Um diese Methode anzuwenden solltest du aber zumindest grundlegende
WinAPI-Kenntnisse besitzen. Du solltest also wenigstens wissen, was ein
HWND ist, wie man es erstellt, freigibt und wie das Nachrichtensystem
von Windows funktioniert. Dein Programm muss schließlich auch korrekt
auf "Beende-Dich"-Nachrichten reagieren (auch wenn das nur beim
Herunterfahren vorkommen sollte).

von Philipp Karbach (Gast)


Lesenswert?

du hast schon recht, dennoch behaupte ich es würde auch so einfach
funktionieren ;). Zwar ist das unsauber und hässlich aber ich glaub ich
hab es schonmal in dieser popeligen minimalversion probiert.

von Christoph _. (chris)


Lesenswert?

> du hast schon recht, dennoch behaupte ich es würde auch
> so einfach funktionieren ;).

Natürlich "funktioniert" das im Sinne von "kein Fenster erscheint".
Das liegt aber keineswegs an der Genialität dieses Codes, sondern einzig
und allein daran, dass nahezu alle WinAPI-Funktionen äußerst defensiv
programmiert sind und ihre Parameter ausgiebig prüfen.

Da das Programm zum Zeitpunkt des Startens noch kein gültiges
Window-Handle in seiner Handle-Liste hat, ist es egal, was in der
Variablen hWnd steht, es ist so oder so ungültig. ShowWindow erkennt
das und liefert einen Fehlercode zurück, ohne weitere Aktionen
auszuführen. Das Programm hat in dem Zustand abgesehen von den
verschwendeten CPU-Takten denselben Effekt wie ohne ShowWindow-Aufruf.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die saubere Alternative wäre es, das Programm als Dienst (Service) zu
programmieren, dann kann es nämlich auch dann laufen, wenn kein
Benutzer am System angemeldet ist.
In *nix-speak ist so etwa ein Daemon.

Das setzt allerdings eine der ernstgemeinten Windows-Versionen voraus
(also kein Windows 95 oder einen seiner Aufgüsse, sondern jede
beliebige NT-Version, was Windows 2000 und XP einschließt).

von Christoph W. (christoph)


Lesenswert?

Am einfachsten geht das, indem du ein kleines Programm schreibst, das
das andere startet. Mit WinExec(Programmname,SW_HIDE) kannst du ein
Programm "versteckt" starten.

Einfach ein neues "Console-Projekt" erstellen, dann lösche {$APPTYPE
CONSOLE} und änderst "uses sysutils" in "uses windows" um.
1
[c]
2
program Project1;
3
4
{$APPTYPE CONSOLE}
5
6
uses
7
  SysUtils;
8
9
begin
10
  { TODO -oUser -cConsole Main : Insert code here }
11
  winexec('Programmname / Pfad',SW_HIDE');
12
end.
[/C]

Das soltle dann so aussehen.

Das Programm wird dann nur ein paar KB groß. (bei Delphi 6 glaub ich 8
KB).

Du könntest das auch anpassen, indem du den Pfad aus der  Kommandozeile
holst. Dann kannst du das Teil universell verwenden.

Zum Schluss legst du dann das Programm / eine Verknüpfung auf das
Programm in den Autostartordner. Fertig.

von Jens (Gast)


Lesenswert?

Willst du deine Anwendung eigentlich auch im Taskmanager verstecken?
Auch dafür gibts recht einfache Methoden, einfach mal googlen.

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.