Laden...

Forenbeiträge von wurstpeter Ingesamt 76 Beiträge

09.05.2008 - 00:17 Uhr

Danke für eure Antworten.

Ich habe meinen Code überarbeitet in Berücksichtigung der Anweisungen ([FAQ] Warum blockiert mein GUI?).

Die "Aufhängungsrate" hat sich deutlich verringert, tritt aber doch noch innerhalb von 20-50 Minuten auf.

07.05.2008 - 21:57 Uhr

Hallo,

ich habe ein kleines Problem mit meinem Programm...

Und zwar friert in unregelmäßigen Abständen die Programmoberfläche bzw. das Programm ein.

Die CPU Auslastung schnellt dann auch auf 50% hoch für das Programm.

Leider ist der Code inzwischen sehr umfangreich, und nicht mehr so schnell überschaubar.

Gibt es eine Methode, mit der ich schnell feststellen kann wann sich das Programm aufhängt, bzw. in welcher Methode?

Ich benutze viel Threading in Verbindung mit dem WebClient.

Würde mich freuen wenn jemand Rat weis 😉

Gruß Peter

09.08.2007 - 14:35 Uhr

Hallo,

ich bin mal wieder auf ein kleines Problem gestoßen:

Ich habe ein Fenster von einem Spiel, dass ich in den Vordergrund bringen möchte.

Jetzt funktioniert das ganze auch wenn das Fenster irgenwo im Hintergrund rumdümpelt.

Wenn ich nun aber bei dem Fenster auf das "minimiren" Symbol klicke und anschließend das Fenster wieder in den Vordergrun holen will klappt das ganze nicht.

In der Taskleiste blinkt zwar der Fenstertext kurz auf , aber weiter passiert nichts.

Ich habe es mit bereits mit folgenden Methoden erfolglos probiert:

 Dll.ShowWindowAsync(handle, Dll.SW_SHOW);
            Dll.ShowWindow(handle, Dll.SW_SHOW);
            Dll.SetForegroundWindow(handle);
            Dll.BringWindowToTop(handle);

Leider nichts zu machen, weis jemand rat?

Danke

21.07.2007 - 14:39 Uhr

*nachtrag*
sry

21.07.2007 - 14:14 Uhr

Dankeschön, dass sieht doch schon sehr nützlich aus.

Nun hätte ich noch hinzuschreiben sollen ob es möglich ist den Namen vom eingeloggtem Nutzer zu ändern?

Wohl eher nich odeR?

21.07.2007 - 11:55 Uhr

Hallo,

ich möchte den Benutzernamen des im Moment eingeloggten Nutzers von Windows ändern.

Über die Systemsteuerung geht das ja wundebar...
Benutzerkonto auswählen und auf "Eigenen namen ändern" klicken.

Kann man das auch mit C# lösen?

Danke für eure Hilfe

10.07.2007 - 23:25 Uhr

Oha,

nun hab ich da ein Problem mit der Umrechnung... die zieht enorm performance und macht meine ganze funktion extrem langsam.

ich habe ein Bild von etwa 800x600 pixel, bei dem ich jeden pixel mit der zu findenden Farbe abgleiche, wenn ich nun jeden Pixel erst in hsl convertieren muss und wieder zurück dauert der ganze durchlauf mehrere Sekunden.

10.07.2007 - 23:02 Uhr

Nunja

meine GetPixel funktion gibt mir solche werte zurück, durch recherschieren habe ich auch herausgefunden wie sich die zahl zusammen setzt,
eben durch R G B:
R 255, G 255 und B 255 ergeben z.B. "16777215" also 0xFFFFFF

Die Abweichungen würde ich so definieren:

Die Abweichung sollte im gleichen Farbspektrum sein, also bei blau z.B. die nächsten 10 blau Töne und die vorheringen 10 Blau Töne im Spektrum.

Würde schon reichen den Wert wieder in RGB zerlegen zu können, denke ich.

10.07.2007 - 22:49 Uhr

Hallöchen zusammen,

ich habe eine Farbe im RGB Format:

z.B. "13160660"

Nun bin ich verzweifelt nach einer Formel oder nach einem Beispiel zu Suchen, die mir ermöglichen die bestimmte Abweichungen der Farbe zu erlauben.

Da ich nich der große Mathematiker bin, kapier ich das RGB system auch nich.

Nun meine Frage wie finde ich raus wie startk
z.B. "13160536" von "13160660" abweicht?

Wäre super wenn jemand bescheid weis, ich möchte z.B. nur Abweichungen von etwa 20 Shadern / Variationen der Farbe erlauben.

24.05.2007 - 13:16 Uhr

Huhu,

ich hab nur ne kurze Frage..
hab schon gegooglet und nichts wirklich passendes gefunden.

Ich bin auf der Suche nach einer ChatBot ähnlichen A I , die man als Referenz oder so in eine C# Application einbauen kann.

Ich denke dabei an so was ähnliches wie ALICE (falls das jemand kennt).

Wäre super wenn so was möglich wäre.

MfG

Peter

18.05.2007 - 11:53 Uhr

Es wäre verdammt wichtig für mich herauszufinden warum das bei manchen nicht läuft 🙁

P.S. um unter Win Xp programmierte C# applications in Vista zum laufen zu bringen, muss man das was beachten? Denn unter windows vista läuft noch weniger 😜

17.05.2007 - 17:25 Uhr

Hallo,

auf meinem Rechner läuft das programm ohne Probleme, nun habe ich aber von anderen mitbekommen, dass sie einen Fehler beim klicken auf enem button bekommen.
Mein Programm sucht beim button klick nach einem bestimmten Fenster dazu benutze ich eine windows classe aus dem Internet.
Die Methode "GetEnumerator", bei der der Fehler liegt sieht so aus:

	//implement IEnumerable
		public IEnumerator GetEnumerator()
		{
			return (IEnumerator)this;
		}

Der Fehler den "andere" Leute bekommen ist folgender:

************** Exception Text **************
System.TypeLoadException: Method 'GetEnumerator' in type 'BGtool.‰' from assembly 'BGtool, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
at Tool.MainForm.windows()
at Tool.MainForm.button_Click(Object sender, EventArgs e)
[...]

An was könnte das liegen, dass es nicht bei jedem auftritt?

17.05.2007 - 14:43 Uhr

Hm,

vielen Dank für eure Antworten, aber PointToScreen und PointToClient scheint mir ja nur weiterzuhelfen, wenn es um eine Form meiner eigenen Application geht.

Die Frage ist: Kann ich PointToScreen/Client auch auf ein "Fremdes" Fenster anwenden?

13.05.2007 - 21:13 Uhr

Hallochen

ich benutze im Moment folgendes um die Maus Koordinaten auszulesen, wo sich die Maus grade befindet.
Funktioniert auch perfekt auf der ganzen Bildschirmgröße.

       [DllImport("user32")]
        public static extern int GetCursorPos(ref Point lpPoint);
 Point defPnt = new Point();
  GetCursorPos(ref defPnt);

Nun möchte ich aber gerne die Koordinaten im Verhältniss zu einem bestimmten Fenster haben.

Ich erklär das grad ein bisschen doof, mir fällt das auch schwer zu erklären.

Sprich wenn ich oben genannte Methode benutze hat die obere linke ecke meines Desktops die Koordinaten X = 0 und Y=0 .

Nun angenommen habe ich ein kleines Fenster in der Mitte des Desktops, und möchte, dass die obere Linke Ecke von diesem Fenster X=0 und Y=0 ist.

Ich denke jetzt versteht man etwa was ich meine... ´
leider ist das Fenster eine Fremdapplikation, so dass ich die internen Form Methoden nicht verweden kann.

Also wie könnte ich es z.B. machen das GetCursorPos nur auf das spezielle Fenster angelegt ist.

MfG

Peter

05.05.2007 - 00:22 Uhr

Hallo,

ich bin auf folgendes Probllem gestoßen:

Ich benutze den Schnipsel aus folgendem Thread um die Reiter Farbe zu ändern:

Farbe von TabControl ändern?

Wie man nun unschwer an meinem Screenshot sehen kann gibts nun Zwei störende Sachen:

Ersteres: Wie bekomme ich den restlichen Teil des TabControls (also der noch graue Bereich auf der Form) in die selbe Farbe wie mein TabPage background?

Zweites: Wie bekomme ich den grauen Rand um das "nicht aktive Tab" (also tabpage2) weg.. ich weis ist zwar nur minimal stört aber.

Vielen Dank für eure Mühe

22.04.2007 - 01:44 Uhr

Wow vielen Dank, das ist genau das was ich gesucht habe... jedenfalls zeigt es den Sound Input an, nur leider funktioniert es für mein Einsatzgebiet nicht:

Folgendes die Erkennung von Sounds in der Windows Umgebung funktioniert excellent,
nun wechsle ich aber in mein Spiel (das im Fenstermodus läuft, dass ich die Volumecontrol Anzeige sehen kann) und spiele im Spiel (Ist ein 3D spiel) einige Sounds ab und kann leider keine Änderung des Volumeerkennungs balken erkennen.

Bedeutet: Sounderkennung funktioniert nicht während des Spielens, gibt es da eine Andere möglichkeit den Sound aus dem Spiel zu erkennen?

Also sobald ich das Spiel fokusiere werden auch keine Volume events mehr dargestellt, seltsam 🙁

Dankeschön

P.S. eine andere Möglichkeit könnte ich mir auch so vorstellen:
Man überwacht die "sound.wav" Datei im Spiele Ordner und wenn sie abgespielt wird kann man es erkennen.... nur frage ich mich da auch wieder wie...

21.04.2007 - 14:34 Uhr

tschuldigungs fürs doppelt / dreifach posting
gibts da nicht irgend einen Ansatz?
Soltle doch nicht so schwer sein div. Sprachprogramme können ja auch erkennen wenn etwas "gesprochen" wird... z.B. Teamspeak

15.04.2007 - 20:27 Uhr

Keiner ne Idee wie das umzusetzen ist?

13.04.2007 - 02:37 Uhr

Hallo,

ich würde gerne wissen ob es möglich ist "Lautstärke" mit C# zu erkennen.

Folgendes:

Ich möchte eine Bestimmte Funktion ausführen lassen wenn der "Stereo Mix" der Soundkarte ein bestimmtes Level erreicht.

Normalerweise liegt der Sound level bei 0%, wenn man nun Musik abspielt steigt er an, je nachdem wie laut man die Musik dreht steigt der Soundlevel.

Leider kann ich schlecht erklären was ich meine, ich hoff dass trotzdem jemand was weis.

Vielen Danke schonmal

Also nochma kurz gefasst, ich will erkennen wenn ein Ton am PC abgespielt wird.
Z.B. ein "Schrei" in einem Spiel

30.11.2006 - 18:42 Uhr

Heyho 🙂

*Gelöst Oo*
Ich starte mein Programm und möchte den Namen meines Programms (z.B. programm.exe) per cmd parameter an ein 2. Programm übergeben.
Das ist auch kein Problem wenn der Programmname statisch bleibt.

Nun sagen wir einfach mal der Nutzer ändert den Namen des Programms in programm123.exe nun wird aber immer noch als parameter programm.exe übergeben, was zur Folge hat das der Programmname nicht korrekt übergeben wurde.

Lange Rede kurzer Sinn...
Wie kann ich meinen Prozessnamen rausfinden?

Process current = Process.GetCurrentProcess();		

 string name= current.ProcessName;
21.11.2006 - 13:52 Uhr

Das hab ich vor kurzem auch versucht, und ich glaube fast, dass es keine möglichkeit gibt eine .Dll einzubinden und gleichzeitig in dem selben Programm zu verwenden.

Ich habe dann einfach 2 ausführbare Programme geschrieben, da ich aber auch wie du nur 1 Endprogramm haben wollte.
Habe ich einfach die .exe "1" meine Dll und mein Programm "2" auspacken und registrieren lassen. Danach habe ich Programm "2" das die .dll verwenden soll starten lassen und Programm "1" löschen lassen.

Hört sich vielleicht verwirrend an ist aber ziemlich einfach und der ganze Vorgang geht so schnell, dass der Nutzer das auch gar nicht mitbekommt.

21.11.2006 - 00:27 Uhr

Nach anderen Trennzeichen hab ich schon gegoogled,
will mir das Ding aber einfach nicht trennen.

aber ich habs jetzt endlich geschafft...danke euch für die hilfe

 string[] foo = deleteunused.Split(new Char[] { ' ' });
 string s2 = foo[2];
 string s1 = foo[3]; 

Wars 🙂

20.11.2006 - 21:28 Uhr

Mhmjah 😁

Das klingt einfach... funktioniert warum auch immer nicht 😠

string[] foo =  replaced.Split(new Char[] {' '});
string s1 = foo[0];
string s2 = foo[1]; 

MessageBox.Show(s2+s1);

Die MessageBox gibt einfach einen leeres Feld aus, also scheint der String irgendwie leer zu sein.

Gebe ich aber replaced in der MessageBox aus kommt: 614.82 -3030.97

20.11.2006 - 19:50 Uhr

Hallo,

ich habe verschiedene string (aus ner .txt datei) z.B.

  1. zahlenwert =x 2. zahlenwert = y
 
 <Waypoint>590.25 -2968.61</Waypoint>
  <Waypoint>587.87 -2951.41</Waypoint>
  <Waypoint>585.48 -2934.39</Waypoint>


//nun mache ich erstmal ein replace:

string zeile=reader.ReadLine();
string replaced=string.Format(zeile.Replace("<Waypoint>", string.Empty).Replace("</Waypoint>", string.Empty));      

/*Dann habe ich versucht mit der [URL]http://www.c-sharpcorner.com/1/SuperStringMG.asp[/URL] die einzelnen koordinaten (x + y) rauszuschneiden.
\*/

SuperString s=replaced;
string s2 = s.Right(8); //gibt die y- Koordinate aus
string s1 = s.Mid(2,9); //gibt die X- Koordinate aus
 

Voila... ich bekomm die x und y koordinate so wie gewünscht 😉

Nun habe ich leider feststellen müssen, dass ich auch text dateien mit x+y Koordinaten habe deren länge andauernd variert, deshalb ist es fast unmöglich einen String rauszuschneiden, da sowohl x + y total verschieden sein können:
Und mir somit meine Zahlen abgeschnitten werden etc. .

Siehe Beispiel:


<Waypoint>-14489.87 -45825.16</Waypoint>
<Waypoint>-24.97 -11.54</Waypoint>
<Waypoint>585.48 -2934.39</Waypoint>

Nun meine Frage an euch:

Wie kann ich trotz unterschiedlicher x+y längen trotzdem den x+y zuverlässig rausbekommen?

Danke schonmal

22.10.2006 - 02:16 Uhr

Heya 🙂

Ich habe eine Datenbank in folgendem format:

User / password / posts / wert / übrig

Wenn sich ein Nutzer über meine Datenbank einloggt erhält er so viele Minuten (arbeitszeit) in meinem Programm wie er posts in der Datenbank hat.

Wert ist nochmal der postcount z.b. 100 (posts)
Wenn er nun sagen wir 30 Minuten mit meinem Programm gearbeitet hat, sollen bei übrig nur noch 70 stehen.
(verbliebene zeit z.b.)

Das ist nicht das große Problem das so zu ändern.

Das Problem ist:

Ich möchte, dass der übrig Wert in der db nach 24h wieder zurückgesetzt wird.
Da ich aber mehrer Nutzer habe, möchte ich das nicht per cronjob machen, sondern für jeden einzelnen "individuell".

Hat jemand ne Idee das sinnvoll zu lösen?
(ohne dass es einfach umgangen werden kann...)

13.10.2006 - 16:56 Uhr

Naja ups... kleiner denkfehler:

Nehmen wir an die 63 Posts sind "variable" ich möchte ja auch die posts von anderen usern die sich einloggen auslesen, welche z.b. 100 oder 77 Posts haben..

jetzt steht ja im int.parse meine post anzahl: "63
angenomme ich weiß aber nicht wie viel posts der eingeloggte user hat wie bekomme ich dann den Post count aus dem html quelltext?

(nein es ist nicht meine seite, also ich habe kein zugriff den source zu verändern)


int count = int.Parse(" Post Count: <b>63</b><br>".Replace("</b><br>", string.Empty).Replace(" Post Count: <b>", string.Empty)); 

9999= post anzahl


 <td align='left'  class='bottomborder'><b>9999</b><br>( 0.02% of total forum posts )</td>

-> hieraus die 63!!

genauso bräuchte ich folgendes


    <td align='left' valign='middle'><b>Logged in as:  <a href='http://forum/index.php?s=&act=Profile&CODE=03&MID=70365'>Username</a></b> 

daraus die: "'http://forum/index.php?s=&act=Profile&CODE=03&MID=70365'" Url
mit der Member Id die hinten dran steht (welche natürlich auch wieder von user zu uiser verschieden ist)

Wäre super wenn das jemand weiß

13.10.2006 - 12:05 Uhr

ne geht leider nicht 🙂
habe ich auch schon versucht.

Denn es wird alles mit dem selben "post" übertragen, bedeutet: dass er in die variable username nun folgendes schreibt: "this.username.Text+"&password="+this.password.Text"

und die variable password bleibt ungenutzt.

13.10.2006 - 02:11 Uhr

Heya 🙂
ja ich schon wieder, aber diesmal hab ich gut überlegt bevor ich poste...
und das halbe net durchsucht:

Ich 2 werte in einer textbox und will die in meiner datenbank als, user +pw haben (selbe reihe versteht sich)


URLTunnel.PostGetURL("http:/space/writename.php","username="+this.username.Text); 
URLTunnel.PostGetURL("http:/space/writename.php","password="+this.password.Text); 			

über die URL-Tunnel funktion aus diesem thread: .txt auf Server öffnen ohne Download (besser mit Database)

Mein Php script das aufgerufen wird.
[php]
$user = trim($_POST['username']);
$pass = trim($_POST['password']);

$sql = "INSERT INTO users SET
username='$user',
sonstiges='0',
posts='0',
value='0',
password ='$pass'";
@mysql_query($sql)
[/php]

Ja das Problem: Ich kann ja nicht direkt zu meinem host connecten per c#
also muss das über das .php script gehen.

Jedenfall funktioniert das "post" perfekt mit einer Variable, z.B.
den Wert von dem "username" schreibt er mir in die Datenbank, aber der Wert des passwords wird nicht reingeschrieben. Oder umgekehrt....

So: Kann man das irgendwie verwirklichen, dass passwort+username (am besten noch weitere variablen) in die database geschrieben werden? -> in die selbe reihe!

Wäre dankbar 🙂
MfG

P.S.: Das ganze sollte dann auch wieder so funktionieren:
Nutzer + PW werden beim einloggen im C# programm in der php gecheckt, also bräuchte ich auch 2 return values (geht bisjetzt auch nur mit einem)


string password Convert.ToString( URLTunnel.PostGetURL("http://server/pw.php", "") );

12.10.2006 - 23:13 Uhr

Harhar 🙂
genial , super vielen dank...

da es bei einem string ja kein parse gibt... was verwende ich wenn ich einen string haben möchte?
/edit/ erst denken dann posten 😠
hab String.Format verwendet damit gehts

12.10.2006 - 22:40 Uhr

Hallo 🙂

Ich bin grade an nem Forum Login dran per Webbrowser control
funktioniert auch.
Nun möchte ich von dem user der grade eingeloggt ist den Postcount abfragen:

Im html code des forums steht das folgendermaßen:


    </table>
    </td>
  </tr>
  <tr>
    <td class='mainbg'>
      <table width="100%" border="0" cellspacing="1" cellpadding="4">
        <tr> 
          <td class="forum2" width="45%">User: <b>Username</b><br>
         Post Count: <b>63</b><br>
            It is now Today 22:17<br>
            Your last visit was on Today 21:52<br>
            <!-- performance update 
			
			There has been <b></b> posts in <b></b> 

Insgesamt hat das html doc ca 1800 zeilen 👍

Naja und irgendwo da drinnen steht: "Post Count: <b>63</b><br>
Soweit so gut, wie kann ich nun die Zahl: "63" die den Post Count darstellt auslesen?
(um in nacher in ne db zu schreiben)

Ich kann die ganze Zeile auslesen, aber wie ich auf auf den Count komm zum auslesen versteh ich nicht, hat leider auch keine id oder so

Wäre dankbar wenn jemand ne Idee hat 🙂
mFg

11.10.2006 - 16:42 Uhr

Danke erstma für eure antworten,
genau auf getpixel bin ich auch gestoßen, aber in einem anderen Thread habe ich glaub mal geschrieben dass das nicht geht.

Denn die "bestimmte farbe" ist unterwegs.

D.H. ich kann nicht alle 0.5 sekunden einen screenshot machen, und nach der Farbe suchen lassen.

Bei erfolgreichem Fund der Farbe soll die Bildschirm position der Farbe ausserdem auch ausgegeben werden.
(was kein problem darstellt).

Aber wie gesagt ich bräuchte eine art "aktive methode" ohne erst screenshots zu machen, dass direkt den bildschirm im aktuellen zustand abließt.

01.10.2006 - 13:55 Uhr

pixelsearch ist eine funktion aus AutoIT (als com referenz eingebaut)

www.autoitscript.com

Ich suche:
-> Muss nich genau das selbe sein, sollte aber ohne AutoIt referenz eine hex farbe auf dem Monitor finden 😉

29.09.2006 - 13:42 Uhr

Hallo ;9
Ich habe vor ein paar Wochen mal was zu pixelsearch in c# geschrieben...
das problem ist... es ist ja nicht wirklich in c#.....sonder mit der Com referenz von autoit geschrieben... nun wollte ich das aber wenn möglich komplett in c# übernehmen... nur finde ich überhaupt keine sachen zu den stichwörtern
pixelsearch etc...

Aufgabe: Suche nach einer bestimmten Farbe auf dem monitor:
z.b. FFFFFF ...tja mit AutoIt referenz kein thema, aber gehts auch ohne?

Wäre super, danke 😉

Achja der c# mit autoit referenz beispiel code:


private int[] PixelSearch(int startX,int startY,int rangeX,int rangeY, int step,int color,int shade)
{
   DateTime start = DateTime.Now.AddSeconds(35);
   while(start > DateTime.Now)
   {
      for(int x=startX;x<startX+rangeX;x+=step)
      {
         for(int y=startY;y<startY+rangeY;y+=step)
         {
            if(autoit.PixelGetColor(x,y)==color)
               return new int[]{x,y};
         }
      }
   }
   throw new ApplicationException("PixelSearch: Failed to find the color ("+color.ToString()+")");
} 

15.09.2006 - 22:29 Uhr

naja 😉 ich hab das bis jetzt alles zufriedenstellen lösen können, dank eurer hilfe 😉

nun steh ich aber wieder vor nem neuen problem^^

Problembeschreibung:

Er findet den SChwimmer, dann sucht der nach dem Splash, welchen er auch findet... danach führt er wieder die Funktion start() aus (nach finden / oder timeout)
Das Problem ist beim 2. ausführen der Funktion start() findet er nur noch den Schwimmer aber er findet den splash nicht mehr, ich denke das liegt a Backgroundworker....(denn beim Schwimmersearch verwende ich dieses nicht und alles klappt)...

Naja leider schaff ich es auch nicht rauszufinden warum er beim 2. durchlauf des Programms... den splash nicht mehr findet.
Vielleicht seht ihr ja da Problem, wäre super nett.
Danke schonmal


void start()
{
this.backgroundWorker2.CancelAsync();
timeout = false;
// Pixelsearch 1 (nach dem schwarzen schwimmer)
search =PixelSearch (55, 150,665,403, 2, 0x000000, 2);
if(autoit.error != 1)
{autoit.MouseMove(search[0],search[1],0);	}
// funktioniert wunderbar... 

this.backgroundWorker2.RunWorkerAsync();	

}

void BackgroundWorker2DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
		{
			
 BackgroundWorker bw = sender as BackgroundWorker;

if (bw.CancellationPending) {
        e.Cancel = true;
        return;
}
searchs =PixelSearchs (s_left, s_top,s_right,s_bottom, 1, 0xFFFFFF, 3);

if(!timeout)
{
	if(autoit.error != 1) // splash wurde gefunden
	{
autoit.MouseClick("right", searchs[0], searchs[1], 1, 1);
start();
}
}

So sieht die funktion für den pixelsearch 2 (Pixesearchs) aus:


      private int[] PixelSearchs(int startX,int startY,int rangeX,int rangeY, int step,int color,int shade)
{
   
   while(starts > DateTime.Now)
   {
      for(int x=startX;x<startX+rangeX;x+=step)
      {
         for(int y=startY;y<startY+rangeY;y+=step)
         {
            if(autoit.PixelGetColor(x,y)==color)
            	return new int[]{x,y};
               break;
         }
      }
   }
   
   timeout = true;
   return null;

} 

Ich hab den code mal "gekürzt" damit ihr es besser überschaun könnt

15.09.2006 - 01:14 Uhr

also
das mit datetime.now hat mich Borg ja schon korrigiert.. habe, dass so auch eingebaut

und der debugger kommt schon in die schleife

was meinste mit ps für die koorinaten gibts die Point Struktur?
stimmt irgendwas damit nicht?

bis jetzt sieht pixelsearch 2. loop so aus:


private int[] PixelSearchs(int startX,int startY,int rangeX,int rangeY, int step,int color,int shade)
{
   
   while(starts > DateTime.Now)
   {
      for(int x=startX;x<startX+rangeX;x+=step)
      {
         for(int y=startY;y<startY+rangeY;y+=step)
         {
            if(autoit.PixelGetColor(x,y)==color)
            	
               return new int[]{x,y};
         }
      }
   }
   
   timeout = true;
   return null;
 } 


funktioniert auch... bis auf dass sich mein programm dabei so gut wie "aufhängt" wegen der großen last ... beim schleifen durchlauf

15.09.2006 - 00:44 Uhr

Da es noch immer für verwirrung sorgt werde ich das mal aufklären inklusive screenshot 😉

Ich geh doch schwer davon aus das bei einer fläche von 50x50 die for schleifen weniger als 1 sekunden brauchen werden

Abfangen kann ich das event nich, da es in einem Spiel passiert... und ich dazu memory reading anwenden müsste was ich 1. nicht kann, und 2. nich will ^^

Das Programm existiert schon "fertig" und funktionstüchtig, als AutoIt code...
nur wollte ich das in ein c# Programm umsetzten, wegen besserer gui und xml reading etc...
-------------------------------------------------------------------------------------------
Der erste pixelsearch (habe ich hier nicht aufgeführt) sucht nach dem schwarzen Schwimmer (im ganzen blauen bereich) welchen er auch wunderbar nach 1-2 Sekunden findet.

So nach dem er gefunden wurde wird der 2. Pixelsearch (die hier aufgeführte funktion) auf 50x50 pixel um den Schwimmer eingegrenzt....(siehe gelber bereich)

Jetzt soll der 2. pixelsearch 35 Sekunden lang in dem kleinen Bereich nach dem Splash suchen welcher "zufällig" auftaucht.

Splash ist rosa gekennzeichnet (die fast weissen tröpfchen)

Hoffe is nun klar 😉

15.09.2006 - 00:11 Uhr

ja etwa...

es ist ein splash... und ein spülash (z.b. wasserspritzer) ist leider sehr schnell wieder weg 😉
naja mein script in AutoIt schafft es jedenfalls den splash zu finden
was mein c# programm nicht schafft

Vergessn dazu zu sagen, dass der splash in einer fläche von etwa ´50x50 pixeln auftritt also durchaus möglich dass er gefunden werden sollte

naja trotzdem krieg ichs irgendwie nich gebackn,.,.. wäre schon sehr nett mit nem background worker

15.09.2006 - 00:02 Uhr

ja besser wäre das ganze doch in nen background worker zu verschieben oder?

da meine form nach 2-3 durchläufen sich aufhängt (also keine rückmeldung)

das script aber weiterläuft...

hab ich auch schon gemacht... wobei ich folgendes verwendet habe:

this.backgroundWorker1.RunWorkerAsync(); // beim pixelsearch anfang

und nachdem der farbcode gefunden wurde
this.backgroundWorker2.CancelAsync();
und wieder main function mit start() aufrufen

der bw sieht bei mir so aus, und cancellation is auch auf true


		void BackgroundWorker2DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
		{
		if (this.backgroundWorker2.CancellationPending) {
		textBox3.Text = textBox3.Text+"\n\n"+"cancel worker";
        e.Cancel = true;
        return;
			}
		// pixelsearch....

start(); // start ist die main function
		}

schön und gut... aber wenn er wieder in die mainform switched hat er ca 2 sekunden zeit sich zu beenden... was er aber nicht macht.. und beim neuen bw aufruf komtm dann eben die execption dass er noch busy is

14.09.2006 - 23:55 Uhr

achja gut 😉
habe es gelöst bis hier hin...

14.09.2006 - 21:38 Uhr

xD sry sorgt vielleicht für verwirrung aber ich erklär das ganze mal.-..

der pixelsearch wird in einem Spiel durchgeführt

Und innerhalb von 35 Sekunden erscheint im Spiel ein Objekt, welches ich finden möchte, da die farbe im Spiel einzigartig ist...

So das Objekt hat die eigenschaft zufällig aufzutreten, an irgendeiner stelle, und das auch nur für 1 sekunde...

Wenn ich jetzt jeden Pixel prüfen würde... dann würde mein pc z.b. das objekt nur durch "glück" finden, da es einfach zu langsam is inenrhalb 1 sekunden einmal den bildschirm abzuscannen

Und da das objekt innerhalb von 35 sekunden auftritt nach start... eben die 35sekunden schleife...

Wenn jemand ne bessre methode... oder auf jedenfall ne "schnellere" pixelsearch methode kennt , höre ich mir dieses gerne an, da ich von meine auch nich begeistert bin 😉

/edit/
achja... und Borg, deine function geht zwar ... aber ich brauch die variable found = true;
und am besten wäre noch dass ganze ohne execption zu lösen 😉... aber wenn ich die exception entferne.. kommt wieder die "not all code path..." fehler

Danke auf jedenfalöl für die schnelle antworten

14.09.2006 - 21:07 Uhr

gut werd ich mir merken 😉

aber wenn ich die if(found)
zeile lösche behebt das leider noch immer nicht mein problem...
denn wenn ich return null; entferne kommt wieder oben genanntes problem...

und wenn ich's drinnelasse krieg ich mit meiner mousemove funktion probleme...
da die n "gültigen" x,y return braucht...
welcher in den 35 sekunden auch garantiert auftritt...

14.09.2006 - 20:30 Uhr

mhjah danke, aber das löst nich wirklich mein problem..
ich habe zwar den return error weg

indem ich einfach vor dem


return null;
  if(!found)
     {

eingebaut habe...

so folgendes problem aber:

Ich möchte ja das mein While loop für 35 sekunden durchläuft und checkt ob die farbe gefunden wurde... und ich möchte nur einen return bekommen, wenn die farbe gefunden wurde/innerhalb den 35 sek)... sonst möchte ich nach dem 35 sekunden eine execption kriegen.

Denn wenn ich einfach nen return null; einbaue

(das while loop mit den 35sek timeout müsste doch so funktionieren?)
bekomme ich probleme mit folgendem:

autoit.MouseClick("right", searchs[0], searchs[1], 1, 1);

Gibts dafürne lösung?

14.09.2006 - 18:44 Uhr

Hallo 😉

ja ich weis ...eigentlich sollte das doch kein Problem sein...
aber irgendwiehäng ich grade... oder mir fehlt die konentration... wenn ich nich schon länger dran hängen würde würd ich auch nich posten ...

deshalb bitte kurz n blick drauf uns sagen was das problem ist

danke euch schonma 😁


   private int[] PixelSearchs(int startX,int startY,int rangeX,int rangeY, int step,int color,int shade)
        {
	    found=false;
 starts = DateTime.Now;
     while(starts.AddSeconds(35) < DateTime.Now)
    {
            for(int x=startX;x<startX+rangeX;x+=step)
            {
                for(int y=startY;y<startY+rangeY;y+=step)
                {
                    if(autoit.PixelGetColor(x,y)==color) // if(autoit.PixelGetColor(x,y)==color)
                        return new int[]{x,y}; 
                    found = true;
                }
            }
     }
     if(!found)
     {
     	throw new ApplicationException("PixelSearch: Failed to find the color ("+color.ToString()+")");
     }
        }


Er meint dazu: MainForm.Pixelsearch(int, int, int, int, int, int, int); not all code patch return a value.

Schon alles möglich probiert aber wie gesagt, komme nich drauf

14.09.2006 - 16:19 Uhr

gut danke für die schnellen antworten, ich werde mir mal das zum thema farbabweichung anschauen...

nun nach einem pixelsearch durchlauf... meldet er entweder "erfolgreich gefunden" oder er gibt die exeption raus, dass es nicht gefunden worde...

ein durchlauf dauert etwa 4 sekunden?? so was in der art...

Problem: Das Objekt tritt zufallsmäßig zwischen 1-30 sekungen auf...
wenn es erst nach 10 sekunden auftritt.. ist ja mein loop schon durch und ich habe die exeption, dass die farbe nicht gefunden wurde...

Dachte mir das könnte ich mim backgroundworker lösen, aber wenn es im backgroundworker läuft krieg ich auch kein ergebnis, ausserdem muss (1-2 sekunden) nachdem die farbe gefunden worden ist der backgroundworker stoppen...

Sieht bei mir gerade so aus: ( das mit dem bool hab ich auch anderst gemacht...)


bool searching = true;
void BackgroundWorker2DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
		{
if (this.backgroundWorker2.CancellationPending) {
		textBox3.Text = textBox3.Text+"\n\n"+"cancel worker";
        e.Cancel = true;
        return;
			}


while(searching)
    {
try{
searchs =PixelSearch (s_left, s_top,s_right,s_bottom, 0, 0xFFFFFF, 1);
     	if(autoit.error != 1) // bedeutet dass etwas gefunden wurde
	{
            MessageBox.Show("found!!!"); // color found exit loop
            break;
        }
}
    }catch{
            
    }
} 

}

Wobei hier das problem wieder ist... dass der loop nur einmal durchgegangen wird.

Naja ihr seht ja wos hängt, wäre dankbar 😉
mfg

14.09.2006 - 02:59 Uhr

Servus zusammen

ich benutze die AutoItx.dll und hab mir die function zusammenge(kl)baut:


private int[] PixelSearch(int startX,int startY,int rangeX,int rangeY, int step,int color,int shade)
        {
            for(int x=startX;x<startX+rangeX;x+=step)
            {
                for(int y=startY;y<startY+rangeY;y+=step)
                {
                    if(autoit.PixelGetColor(x,y)==color) // if(autoit.PixelGetColor(x,y)==color)
                        return new int[]{x,y};
                }
            }
            throw new ApplicationException("PixelSearch: Failed to find the color ("+color.ToString()+")");
        }


Wobei der wert int shade... normalerweise von 0-255 gewählt werden soll, um einzustellen in wie weit der gesuchte pixel vom Ursprungswert der "eingestellten" farbe abweichen darf(RGB)...
das problem ist wie baue ich nun die "abweichung" in die funktion ein?

Das ganze wird von mir so: verwendet:


bool searching = true;
while(searching)
	{
try{
searchs =PixelSearch (s_left, s_top,s_right,s_bottom, 0, 0xFFFFFF, 1);
		bool found= System.Convert.ToBoolean(searchs);
		if(found)
		{
			MessageBox.Show("found!!!"); // color found exit loop
			break;
		}
	}catch{
			
	}
}


/edit/ wobei ich grade gemerkt habe, dass sich mein programm gnadenlos aufhängt... lösung? mhm kriegs net hin
/edit/

Wäre super wenn jemand bescheid wüsste

P.S: die funktion wirft nach etwa 7 Sekunden die exeption auf...lässt sich das auf etwa 30 sekunden verlängern?
(da ich den pixelsearch für mindestens 30 sekunden brauche, da in dieser Zeit "zufallsmäßig" im Siel ein objekt mit der ´bestimmten Farbe auftaucht... nach dem Ich suche.... und das innerhalb den 7 sekunden meistens noch nicht passiert ist

Dankesehr

13.09.2006 - 19:19 Uhr

Stehe vor nem kleinen Problem:

Ich möchte die AutoItX Klasse benutzen für mein c# Programm...
Ja wie ich festgestellt habe ( benutze es als COM) hat nich jeder die AutoItx .dll in seinem System registriert...
wie man registriert is mir klar, klappt auch wenn ich sie in über n zweiter programm registrieren lasse...

aber wenn ich die .dll in einem Project, registrieren und benutzen will (per using) schlägt das fehl... da er meint die .dll wäre nicht registriert und gar nicht startet da ich


using AutoItX3Lib; 

verwendet hab..

So lange rede kurze frage 😉

Ist es machbar die dll in einer .exe zu registrieren und zu benutzen#
oder muss ich bei meinen 2 Proggs bleiben

Danke

13.09.2006 - 02:08 Uhr

Mein Code sieht folgendermaßen aus...



[DllImport("user32.dll")]
public  static extern int  SetForegroundWindow(IntPtr hwnd);



void Button5Click(object sender, System.EventArgs e)
{

Process[] myProcesses = Process.GetProcessesByName("WoW");
foreach (Process p in myProcesses) {
 
    hwndMain = p.MainWindowHandle;
	
}
   SetForegroundWindow(hwndMain);

Ich hab das ganze auch schon mit folgendem probiert:


[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName,
    string lpWindowName);

IntPtr wowopen = FindWindow(null, "World of Warcraft");
 if (wowopen == IntPtr.Zero)
    {
        MessageBox.Show("WoW is not running.");
        return;
    }
    //ShowWindowAsync(wowopenb,SW_SHOWNORMAL);
	SetForegroundWindow(wowopen);

naja aber egal wie ichs dreh.. das gewünschte window tritt einfach nicht in den Vordergrund 🙁

Wäre super wenn mir jemand sagen könnte was ich falsch mache

18.08.2006 - 11:33 Uhr

Mhm,

mein "Projekt" hat was mit netzwerktechnologien zu tun,
da habe ich versehentlich die Kategorie verwechselt 🙁

Könntest du mir ein Beispiel geben wie ich das Event vor Application.Run abonniere?
Komme leider nicht dahinter, finde nur Form.Load.+

Also wenn ich auf das X der Form klicke oder rechtsklicke und schließe erscheint das Window mit "GEKILLT".
Aber noch immer... wenn ich das programm über den TaskManager schließe passiert nichts...

Danke
Peter

18.08.2006 - 01:17 Uhr

Danke habe es grade probiert...

dein code reingeschrieben...
doofe frage, muss ich das noch irgendwie wie bei FormClosed zuweisen?
Weil wenn ich den code einfach reinschreibe, kommt die messagebox nicht beim beenden.

Nein arbeite leider mit SharpDevelope

18.08.2006 - 00:23 Uhr

Hallo,

ich stehe vor nem kleinen Problem, dass ich leider nich lösen kann:


void Form1FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e)
		{
			deletesession();
		}

So sieht mein code aus...
funktioniert auch wunderbar wenn man die Form schließt indem man auf das X drückt!

So Problem: Wenn jemand mein Programm im Taskmanager schließt wird die Funktion jedoch nicht aufgerufen.

Wie bringe ich mein Programm dazu, dass es die Funktion deletesession() auch ausführt wenn es mit dem TaskManager geschlossen wurde?

Danke
Peter