[C#] Togglebutton Fehler.

06/30/2014 15:39 End-of-Olymp#1
Ich habe ein kleines Anmeldeskript für einen Prozess namens game.bin geschrieben. Ich habe das ganze als Checkbox gemacht, um einen Togglebutton zu bekommen. Mit einem normalen Button hat soweit alles funktioniert(einziger Unterschied ist dass die Variable a immer gleich bleibt)
Ein zweiter Button diente dabei als Stop Button.

Es sollte zumindest bei einmaligem Klicken funktionieren!

Hier einmal der Teil des Toggle-Buttons:

Code:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            int a = 1;
            string pName = "game.bin";
            const uint WM_KEYDOWN = 0x0100;
            
            a = a - 1;

            Process[] processes = Process.GetProcessesByName(pName);

            foreach (Process p in processes)
                if (p.ProcessName == pName)
                {

                    while (a == 0) ;
                    ActivateApp(pName);
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.E, 0);
                    System.Threading.Thread.Sleep(200);
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.N, 0);
                    System.Threading.Thread.Sleep(200);
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.D, 0);
                    System.Threading.Thread.Sleep(200);

                }
        }
06/30/2014 15:51 Requi#2
a ist lokal und kann daher nicht von einer 2. methode verändert werden, falls das, das problem ist.
dazu würde ich dir empfehlen mit Booleans zu arbeiten anstatt ints mit 1 und 0.
06/30/2014 18:52 End-of-Olymp#3
Quote:
Originally Posted by Requi View Post
a ist lokal und kann daher nicht von einer 2. methode verändert werden, falls das, das problem ist.
dazu würde ich dir empfehlen mit Booleans zu arbeiten anstatt ints mit 1 und 0.

Ich habe die a Variable jetzt zusammen mit dem a=a+1 in die if klammer gepackt, aber nunmehr macht das Programm gar nichts mehr außer sofort freezen, wenn ich den start button klicke!

Könnte mir dazu jemand einen Tipp geben:
(und noch wichtiger: Momentan kann man kein zweites Mal auf start klicken, da man im Fenster sofort nichts mehr machen kann)

Wie kann ich den Wert einer Boolean ändern(also bspw. nach false )?

Code:
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            string pName = "game.bin";
            const uint WM_KEYDOWN = 0x0100;

            Process[] processes = Process.GetProcessesByName(pName);

            foreach (Process p in processes)
                if (p.ProcessName == pName)
                {
                    int a = 1;
                    a = a - 1;
                    while (a == 0) ;
                    ActivateApp(pName);
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.E, 0);
                    System.Threading.Thread.Sleep(200);
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.N, 0);
                    System.Threading.Thread.Sleep(200);
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.D, 0);
                    System.Threading.Thread.Sleep(200);

                }
06/30/2014 19:31 th0rex#4
while (a == 0) ;
Deswegen freezt dein Programm. Machst die ganze Zeit einfach nichts.
06/30/2014 19:33 Requi#5
Quote:
Originally Posted by omitma View Post
while (a == 0) ;
Deswegen freezt dein Programm. Machst die ganze Zeit einfach nichts.
Und weil alle Methoden im UI Thread laufen.
06/30/2014 19:51 End-of-Olymp#6
Quote:
Originally Posted by omitma View Post
while (a == 0) ;
Deswegen freezt dein Programm. Machst die ganze Zeit einfach nichts.
Vielen Dank an euch beide. Das war es.
Nun funktioniert alles wie es gedacht war!

So ein simpler Fehler :rolleyes:

Könntest du mir eventuell noch erklären, wie ich eine Boolean Variable von bspw. true nach false stelle?
Mit welchem Befehl mache ich das?
06/30/2014 21:06 stotterer09#7
Quote:
Originally Posted by End-of-Olymp View Post
Vielen Dank an euch beide. Das war es.
Nun funktioniert alles wie es gedacht war!

So ein simpler Fehler :rolleyes:

Könntest du mir eventuell noch erklären, wie ich eine Boolean Variable von bspw. true nach false stelle?
Mit welchem Befehl mache ich das?
Code:
Boolean b = true; //ist am anfang wahr

b = false; // wird dann falsch
07/01/2014 02:39 Black Tiger ツ#8
Du brauchst doch gar keinen bool?
Code:
//private bool AllowChanges = true;
private string pName = "game.bin";
private const uint WM_KEYDOWN = 0x0100;

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
                Process[] processes = Process.GetProcessesByName(pName);

                while (checkBox1.CheckState == CheckState.Checked)
                {
                  foreach (Process p in processes)
                   {    
                       if (p.ProcessName == pName)
                        {
                            ActivateApp(pName);
                          PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.E, 0);
                           System.Threading.Thread.Sleep(200);
                           PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.N, 0);
                          System.Threading.Thread.Sleep(200);
                          PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.D, 0);
                          System.Threading.Thread.Sleep(200);
                     }
                 }
            }
  
        }
        
        
        
        
        private void stopButton_Click(object sender, EventArgs e)
        {
                checkBox1.CheckState = CheckState.Unchecked;
        }