2012-04-03 6 views
-1

Ich mache einen kleinen Bot in C#.
Im Moment funktioniert es ziemlich gut, es kann Text aus einer Datei laden und für Sie eingeben.Variablen aus XML lesen, um Maus zu bewegen

Ich möchte das Programm mit meinen Freunden teilen. Aber ich stolpere über ein kleines Problem.
Wenn sich die Auflösungen ändern, ändern sich die Schaltflächen und Textfelder.

Deshalb möchte ich meinen Freunden erlauben, die Mausposition zu schreiben ist eine XML-Datei, die ich in mein Programm lade.

in den Variablen zu laden, ich verwende dieses Skript:

private void Initialize() { 
    XmlTextReader reader = new XmlTextReader(Application.StartupPath + @"..\..\..\CursorPositions.xml"); 

    while (reader.Read()) { 
     switch (reader.NodeType) { 
      case XmlNodeType.Element: // The node is an element. 
       element = reader.Value; 
       break; 
      case XmlNodeType.Text: //Display the text in each element. 
       switch (element) { 
        case "Textbox-X": 
         textX = int.Parse(reader.Value); 
         break; 
        case "Textbox-Y": 
         textY = int.Parse(reader.Value); 
         break; 
        case "SliderBegin-X": 
         sliderX = int.Parse(reader.Value); 
         break; 
        case "SliderBegin-Y": 
         sliderY = int.Parse(reader.Value); 
         break; 
        case "SubmitButton-X": 
         submitX = int.Parse(reader.Value); 
         break; 
        case "SubmitButton-Y": 
         submitY = int.Parse(reader.Value); 
         break; 
       } 
       break; 
     } 
} 

Und das ist meine XML-Datei:

<?xml version="1.0" encoding="utf-8" ?> 
<CursorPositions> 
    <Textbox-X>430</Textbox-X> 
    <Textbox-Y>270</Textbox-Y> 

    <SliderBegin-X>430</SliderBegin-X> 
    <SliderBegin-Y>470</SliderBegin-Y> 

    <SubmitButton-X>860</SubmitButton-X> 
    <SubmitButton-Y>365</SubmitButton-Y> 
</CursorPositions> 

Das Schema sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="CursorPositions"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Textbox-X" type="xs:unsignedShort" /> 
     <xs:element name="Textbox-Y" type="xs:unsignedShort" /> 
     <xs:element name="SliderBegin-X" type="xs:unsignedShort" /> 
     <xs:element name="SliderBegin-Y" type="xs:unsignedShort" /> 
     <xs:element name="SubmitButton-X" type="xs:unsignedShort" /> 
     <xs:element name="SubmitButton-Y" type="xs:unsignedShort" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Leider gibt es beim Testen immer {0,0}.

Weiß jemand, was los ist?
Oder haben Sie vielleicht eine Lösung?

PS: für diejenigen, die wissen wollen, funktioniert die Maus zu bewegen wie folgt aus:

private void MoveMouse(int X, int Y) { 
    Cursor.Position = new Point(X, Y); 
    mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); // press left mouse button 
    mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0); // release left mouse button 
} 

Sie müssen diesen Teil in der Spitze des Codes gehören:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); 

public const int MOUSEEVENTF_LEFTDOWN = 0x0002; 
public const int MOUSEEVENTF_LEFTUP = 0x0004; 
public const int MOUSEEVENTF_RIGHTDOWN = 0x0008; 
public const int MOUSEEVENTF_RIGHTUP = 0x0010; 
+1

Was genau wollen Sie bauen? Es sollte einen anderen "besseren" Weg geben, dies zu tun. – Shoban

+0

@Shoban Ich versuche, einen kleinen Bot zu machen. Ein Freund von mir hat es mit AutoIT gemacht, was ganz gut funktioniert. Aber ich möchte es in C# tun, als ein Projekt für mich – GroundZero

+0

Meine Meinung: Dies ist nicht der beste Weg, um einen Bot zu bauen, d. H. Es Mauszeiger bewegen und Sachen klicken. Wie wäre es mit diff Auflösungen? Howabout restauriertes Fenster? Hast du das alles überprüft? Wie wäre es mit einem unerwarteten Alarm/Fenster durch andere Anwendungen? – Shoban

Antwort

0

Wenn Sie wollen "Click" oder andere UI-Ereignisse senden, werden Sie wahrscheinlich die Sendinput() API verwenden möchten:

http://msdn.microsoft.com/en-us/library/ms646310%28VS.85%29.aspx

Siehe auch:

Moving mouse cursor programmatically

+0

Ich muss in das Textfeld bewegen, klicken Sie darauf, um darauf zu konzentrieren, starten Sie den Typ Skript, bewegen Sie den Schieberegler, halten Sie die Maus auf sie beim Ziehen, auf die richtige Freigabe position & click auf den submitbutton – GroundZero

+0

Bewegen der Maus scheint jetzt zu arbeiten. Scheint so, als ob das Problem darin läge, die Positionen aus der XML-Datei zu laden – GroundZero

0

ich das Problem behoben, indem eine Text-Datei verwendet.
Es ist nicht die Lösung, die ich wollte, aber es funktioniert ...

private void Initialize() { 
    if (CheckPositions()) { 
     ReadPositions(); 
     MessageBox.Show("Loaded positions", "Go on!", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    } else 
     MessageBox.Show("Something went wrong trying to read positions.txt\r\nDelete the file and try again.", "Woops", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

private bool CheckPositions() { 
    if (File.Exists(Application.StartupPath + @"\positions.txt") && File.ReadAllLines(Application.StartupPath + @"\positions.txt").Length == 6) 
     return true; 
    else 
     if (EnterPositions()) 
      return CheckPositions(); 
     else 
      return false; 
} 

private bool EnterPositions() { 
    bool finished = false; 

    MessageBox.Show("To make sure the mouse clicks on the right places when the program runs, you need to run through these 3 steps." + 
    "\r\nGo to the site and click OK", "First steps", MessageBoxButtons.OK, MessageBoxIcon.Information); 

    TextWriter tw = new StreamWriter(Application.StartupPath + @"\positions.txt",false); 

    MessageBox.Show("Please place your mouse on the textfield" + "\r\n and press Enter", "Textbox"); 
    tw.WriteLine(string.Format("{0,-4:0000} # Textbox X", Cursor.Position.X)); 
    tw.WriteLine(string.Format("{0,-4:0000} # Textbox Y", Cursor.Position.Y)); 

    MessageBox.Show("Please place your mouse on the 0 (zero) position of the Slider" + "\r\n and press Enter", "Slider"); 
    tw.WriteLine(string.Format("{0,-4:0000} # Slider X", Cursor.Position.X)); 
    tw.WriteLine(string.Format("{0,-4:0000} # Slider Y", Cursor.Position.Y)); 

    MessageBox.Show("Please place your mouse on the submit button" + "\r\n and press Enter", "Submit"); 
    tw.WriteLine(string.Format("{0,-4:0000} # Submit X", Cursor.Position.X)); 
    tw.WriteLine(string.Format("{0,-4:0000} # Submit Y", Cursor.Position.Y)); 

    tw.Close(); 
    finished = true; 

    return finished; 
} 

und die Positionen zu lesen:

private void ReadPositions() { 
    TextReader tr = new StreamReader(Application.StartupPath + @"\positions.txt"); 

    string line; 
    while ((line = tr.ReadLine()) != null) { 
     if(line.Contains("Textbox X")) 
      textX = int.Parse(line.Substring(0,4)); 
     else if (line.Contains("Textbox Y")) 
      textY = int.Parse(line.Substring(0, 4)); 
     else if (line.Contains("Slider X")) 
      sliderX = int.Parse(line.Substring(0, 4)); 
     else if (line.Contains("Slider Y")) 
      sliderY = int.Parse(line.Substring(0, 4)); 
     else if (line.Contains("Submit X")) 
      submitX = int.Parse(line.Substring(0, 4)); 
     else if (line.Contains("Submit Y")) 
      submitY = int.Parse(line.Substring(0, 4)); 
    } 

    tr.Close(); 
}