bezüglich Script...

Hallo,

hoffe ich liege hier im richtigen bereich...

Also, ich habe ein Programm welches sich nach einer gewissen Zeit abschaltet (ist wohl so, keine ahnung warum). Ich hab mich schon daran gewöhnt es immer wieder zu starten nach dem off.

Meine Frage nun, könnte man einen Script schreiben, welche alle 30 Sekunden oder jede Minute nachfragt ob das gesagte Programm läuft?Uund wenn nicht sollte es nach 30 sekunden diese programm wieder ausführen...

Ist sowas möglich? Wenn ja könnte man mir vielleicht dabei behilflich sein oder infos zu soetwas geben? Wäre für jede hilfe dankbar.

mfg
Eddy
 
Hallo
jo wäre möglich. Das Prog schaut sich alle Prozesse an (Prozessmanager) und wenn xyz nicht dabei ist, ruft er es auf.

Mal nach Prozessmanager googlen (ist googlen nicht ein geiles offizielles Verb :D )
 
servuz,

ist ganz ezy:

du setzt einen timer (settimer()), der alle 30 secs mit createtoolhelp32snapshot(), process32first()/next()... alle prozesse durchkämmt in der processentry32 structure, die du benötigst werden nach jedem aufruf von process32first()/next() die werte verändert, unter anderem auch szExeFile, den du dan mit dem namen des zu öffnenden prozesses vergleichst. erfolgt keine übereinstimmung startest du den gewünschten prozess mit winexec() oder shellexecute().

cya, hants
 
Also mein OS ist Win XP...

Unter prozessmanager finde ich bei google nur so komische software die nicht das macht was ich gerne hätte oder berufe als Prozessmanager (wusste gar net das es das gibt :D)

@hants was du geschrieben hast mag zwar für dich logisch klingen, aber für einen der noch nie einen script oder ähnliches geschrieben hat, wie micht :), ist das spanisch und russich zusammen ...

vieleicht gibst du mir ne korrekte anleitung mit stellen, wo ich die prozessnamen eintragen muss... *ganzliebguck*

kannst mir auch ne pm schicken, wenn du magst


Edit: Geht sowas vielleicht mit einer bat? oder müsste man es schon mit einem z.B. VB-Script schreiben?
 
servuz,

so jetzt hab ich was derartiges gecoded (das ganze geht auch ohne fenster mit etwas mehr aufwand).
hier mal der code:

Code:
#include <windows.h>
#include <tlhelp32.h>

LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime);

char szClassName[ ] = "testClass";
int stop;
UINT_PTR timerid;
HWND hbtn;

WNDCLASSEX wincl = {sizeof(WNDCLASSEX),CS_HREDRAW | CS_VREDRAW,MainWndProc,0,0,0,0,0,(HBRUSH) COLOR_BACKGROUND,NULL,szClassName,0};

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int nCmdShow)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG msg;            /* Here messages to the application are saved */

    wincl.hInstance = hThisInstance;

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
  
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "test",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           100,                 /* The programs width */
           100,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );


    ShowWindow (hwnd, nCmdShow);
    
	 UpdateWindow (hwnd);
	 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&msg);
        /* Send message to WindowProcedure */
        DispatchMessage(&msg);
    }

    return msg.wParam;
    
    UNREFERENCED_PARAMETER(lpCmdLine);
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                 
    {
        case WM_CREATE:
        {

		  hbtn = CreateWindowEx(0,"BUTTON","start",WS_VISIBLE | WS_CHILD, 10, 10,75,25, hwnd, (HMENU)1, wincl.hInstance, 0);
		  }
		  break;
		  
		  case WM_COMMAND:
			  if ( LOWORD (wParam) ==1)
					{
					if (!stop) {
						SendMessage(hbtn,WM_SETTEXT,0,(LPARAM)"Stop");
			                              timerid = SetTimer(0, 0, 30000, (TIMERPROC)TimerProc);
						}
					else {
						SendMessage(hbtn,WM_SETTEXT,0,(LPARAM)"Start");
						KillTimer(0,timerid);
						}
						stop = !stop;
					}
			  break;
		  
		  case WM_DESTROY:
            PostQuitMessage (0);
            break;
            default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD
dwTime )
{
       int runs = FALSE;
       PROCESSENTRY32 pentry;
       pentry.dwSize = sizeof(PROCESSENTRY32);
       HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
       Process32First(hsnap,&pentry);
       do
       {
  		if (strcmp(pentry.szExeFile,"REGEDIT.EXE") == 0) {
 	 		runs = TRUE;
                              break;
 	 		}
        runs = FALSE;
        }while (Process32Next(hsnap,&pentry));
        if (runs == FALSE) {
        ShellExecute(0,"OPEN","C:\\WINDOWS\\REGEDIT.EXE",0,0,SW_SHOWNORMAL);
		  }

}

das ganze ist kompilierbar(getestet) mit den freecommandlinetools von borland, devc++5 und dem mingw port von gcc.

ersetze regedit.exe[2mal](&den pfad davon[1mal]) durch das gewünschte programm, bei settimer steht als 3. parameter 30000 - das ist die zeit in millisec, die vergeht zwischen den timeraufrufen(also 30 sec). - der rest erklärt sich von selbst.

das gerüst ist geript von devc++ (standardwin32application).

mit einer bat geht das selbstverständlich auch, mit vbs genauso - aber 1. umständlicher, 2. muss dein rechner mehr rechnen , 3. hasse ich scriptsprachen ,4. hasse ich vorallem batch und vb und alles was mit b anfängt

wenn du willst, das dieses programm im hintergrundläuft(ohne fenster) dan kannst du dir die routine zum erzeugen des hauptfensters sparen- es wird aber problematischer(aber nicht sonderlich) das ganze wieder zu stoppen. ich würde dan mit createmutex() prüfen ob das programm schon läuft und es dan mit sendmessage() wm_destroy oder sowas beenden...
diese methode kostet deinen pc sogar noch weniger rechenleistung^^

und übrigens steht in meinem letzten post kein wort auf spanisch oder russisch - das hätte ich gemerkt ;) - und selbst wenn => babelfish hilft weiter :D

cya, hants
 
Habe dir gestern noch ne pm geschickt gehabt, vielleicht hast du sie noch net bekommen oder noch nicht gelesen...schreibe ich mal hier hin ;)

danke erstmal das du dir die mühe gemacht hast für den Code :)

Allerdings kommt ein fehler immer...oder ich mach was falsch.

Ich habe die erste "regedit.exe" von dir mit dem namen des programms geändert.
Eine weiter befehlszeile weiter unten habe ich die genaue adresse angegeben "H:\Programme\xxx\xxx.exe"

In dem fenster mit dem fehler steht folgendes:

Die NTVDM-CPU hat einen üngültigen Befehl entdeckt.
CS:0f69 IP:0103 OP:63 6c 75 64 65 Klicken Sie auf "Schließen", um ...

Ich habe deinen Code in eine .txt eingefügt und diese dann in eine .exe umgewandelt. War das so richtig?

Sorry wenn ich so komische fragen stelle, vor allem dumme Augen :rolleyes:
 
Du hast vermutlich einfach die Endung geändert, oder ?
Also aus XXXX.txt hast du einfach XXXX.exe gemacht, stimmt's ?

So einfach geht das nicht.... du benötigst für den Code einen Compiler !
Dazu kannst du dieses Programm benutzen !

Du musst nur wissen, wie man damit umgeht ... man findet aber Genügend Anleitungen bei Google usw... oder hier in der Suche !
Falls noch Fragen offen sind, poste sie einfach :)

MfG
Lord
 
servuz,

ich kann mir gut vorstellen, dass dich dieses ewige fenster ziemlich ankotzt^^

ich hab hier eine neue version geschrieben - ohne hauptfenster, du deaktivierst es dadurch, dass du es zum zweiten mal startest

weiss irgend wer, wie man an ein fensterloses programm nachrichten übergibt (zb wm_close)??
- ich schließe die erste instanz hier mit terminateprocess, durch das einfache übergeben einer nachricht würde man viel code und laufzeit sparen(und überhaupt wär alles besser)...

also hier mal der code:
Code:
#include <windows.h>
#include <tlhelp32.h>

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );
void killit();
void uppercase (char *src);
int  pathlen (char *src);

int  htrlen;
char hastorun[] = "C:\\WINDOWS\\NOTEPAD.EXE";

int WINAPI WinMain(HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int nCmdShow)
{

 CreateMutex(0,TRUE,"getsomebeer");
 if (GetLastError() == ERROR_ALREADY_EXISTS) {killit();return(0);}

     htrlen = pathlen(hastorun);
     uppercase (hastorun + htrlen);

    SetTimer(0, 0, 3000, (TIMERPROC)TimerProc);

    MSG msg = { 0, 0, 0, 0 };

    for(;;)
        if (GetMessage(&msg, 0, 0, 0) ) {
        DispatchMessage(&msg);
        }
    exit(0);
}

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
	int len;
	int runs = FALSE;
	PROCESSENTRY32 pentry;
	pentry.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	Process32First(hsnap,&pentry);
	do
	{
		len = pathlen(pentry.szExeFile);
		uppercase (pentry.szExeFile+len);
		if (strcmp(pentry.szExeFile+len,hastorun+htrlen) == 0) {
			runs = TRUE;
			break;
		}
	}while (Process32Next(hsnap,&pentry));
	
	if (runs == FALSE) {
		ShellExecute(0,"open",hastorun,0,0,SW_SHOWNORMAL);
	}
}

void killit()
{
	int len;
	PROCESSENTRY32 pentry;
	
	int ownlen = pathlen(_argv[0]);
	uppercase (_argv[0]+ownlen);

	pentry.dwSize = sizeof(PROCESSENTRY32);
	HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	Process32First(hsnap,&pentry);
	do
	{
			len = pathlen (pentry.szExeFile);
			uppercase (pentry.szExeFile + len);
			
			if (strcmp(pentry.szExeFile + len,_argv[0] + ownlen) == 0) {
				TerminateProcess(OpenProcess(PROCESS_TERMINATE,0,pentry.th32ProcessID),0); 
				break;
			}
	}while (Process32Next(hsnap,&pentry));
}

void uppercase (char *src)
{
	for (int i = 0; src[i] != 0; i++)
		{
			if ((src[i] <= 'z') & (src[i] >= 'a'))
				{
				 src[i] -= 0x20;
				}
		}
}

int pathlen (char *src)
{
	int temp = 0;
	for (int i=0;src[i] != 0;i++)
		{
			if (src[i] == '\\'){temp = i;}
		}
	return ++temp;
}


edit: erst jetzt ist mir aufgefallen wie arm c++ eigentlich ist - es gibt nichtmal eigene funktionen zum string uppercasen 8o

cya, hants
 
Also jetzt mit dem zweiten Code klappt aus (hab es kompiliert ;))

Allerdings öffnet dieser mir andauernd das programm...Das heißt...das prog läuft grad und es öffnet es nun zum zweiten und zum dritten, etc...war ne minute mal weg und schon hatte ich das programm 17 mal am laufen ?(
 
servuz,

also eigentlich hab ich den code schon verändert, das dass nicht mehr passiert, was sein kann ist, dass du bei dem vergleich strcmp(blabla,"NOTEPAD.EXE") noch den pfad eingetragen hast. das ist falsch, unter win 9x müsste man überall den pfad eintragen, bei nt systemen (2k und xp) wird der pfad nicht bei process32first/next übergeben. d.h der aufruf ist strcmp(blabla,"exenameohnepfad.exe").

gib den namen in großbuchstaben ein, da ich jezt nicht zwischen den standards von nt un 9x systemen unterscheiden will.

für den fall, dass ich mich irre versuch danach mal noch den pfad dazu einzugeben (mit \\ statt \)

cya, hants
 
Hi,

ich habe es genau so gemacht wie du es meintest :) also liegt schonmal dort nicht der fehler...aber hast du den code nochmal geändert? jetzt geht es nicht mal zu kompilieren?

weil jetzt gibt es den nächsten Fehler :D

Anscheinend ist der untere Teil (unter void uppercase...) fehlerhaft...

Da sind 5 fehler enthalten...

in function ´void killit()´:
syntax error before ´{´ token
´src´ undeclared (first use this function)
(each undeclared identifier is reported only once for each function it appears)
'i´ undeclared (first use this function)
syntax error before ´)´ token

Ich hoffe das sagt dir jetzt was, oder du überprüfst das nochmal selbst...
 
servuz,

hehe ich bin ein noob :P hab ne klammer falsch gesetzt - jetzt läufts ^^

sowas hasse ich an c: mal ne klammer oder strichpunkt vergessen - schon kommen 10000 fehler - ich kenn keine andere sprache die da ähnlich leistungsfähig ist ^^

cya, hants
 
Sorry hants :D

aber es werden immer noch mehrere Fenster geöffnet...

Bei der ersten Stelle habe ich "xxx.exe" eingetragen mal groß mal klein.

Bei der zweiten stelle ist der Pfad angegeben mit der .exe

An der dritten Stelle ist wieder die .exe eingetragen auch mal groß mal klein.

Zudem habe ich an 1 und 3 stelle mal mit kompletten pfad angaben versucht.

mal ne kurze frage...muss ich die Anwendung oder den Prozess angeben, welcher läuft...beide haben verschieden namen. Also bei anwendungen steht z.B. "Internet Explorer" und bei prozesse dann "explorer" (das ist jetzt nur ein beispiel)


EDIT: jetzt hab ich es sogar mit der Anwendung versucht aber dann gibt es fehler, weil diese ja keine .exe datei anzeigt und ausserdem ja zwei wörter drin stehen...

ich verzweifle langsam...
 
servuz,

also jetzt ist das die final release^^

das einzige was du am code änderst ist ganz oben die variable hastorun - da fügst du den pfad+namen des programmes ein, das ständig laufen soll.

jetzt ist es lauffähig unter allen 9x unt nt windos systemen.

kann ja gar nicht sein dass das vorher so kompliziert war X( ^^

weitere probleme(die dieses programm betreffen) bitte per pm - sonst wird das ganze hier zu spam^^

gcc ist echt der beste c compiler - die exe hat bei mir 6.5kb und kommt somit fast an asm code ran :P

ps. lern russisch und spanisch^^

cya, hants
 
Zurück
Oben