2012-04-03 2 views
-1

Я делаю маленького бота на C#.
На данный момент он работает очень хорошо, он может загружать текст из файла и набирать его для вас.Чтение переменных из XML для перемещения мыши

Я хотел бы поделиться программой с друзьями. Но я спотыкаюсь о проблемах.
По мере изменения разрешения кнопки и текстовые поля меняют положение.

Вот почему я хотел бы разрешить моим друзьям писать указатель мыши - это XML-файл, который я загружаю в свою программу.

Для загрузки в переменные, я использую этот скрипт:

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; 
     } 
} 

И это мой XML-файл:

<?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> 

Зонирование выглядит следующим образом:

<?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> 

К сожалению, при тестировании это всегда возвращает {0,0}.

Кто-нибудь знает, что случилось?
Или, может быть, у вас есть решение?

PS: для тех, кто хочет знать, перемещая мышь работает следующим образом:

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 
} 

Вам необходимо включить эту часть в верхней части кода:

[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

Что именно вы пытаетесь построить? Должен быть какой-то другой «лучший» способ сделать это. – Shoban

+0

@Shoban Я пытаюсь сделать маленького бота. Мой друг сделал это с помощью AutoIT, который работает очень хорошо. Но я хочу сделать это на C#, как проект для себя. – GroundZero

+0

Мое мнение: Это не лучший способ создать бота, чтобы он двигал курсором мыши и нажимал на него. Как насчет разностных разрешений? Howabout восстановил окно? Вы проверяете все это? Как насчет неожиданного оповещения/окна другими приложениями? – Shoban

ответ

0

Если вы хотят «Нажмите» или отправить другие события пользовательского интерфейса, вы, вероятно, хотите использовать SendInput (API):

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

Также см:

Moving mouse cursor programmatically

+0

Мне нужно переместиться в текстовое поле, щелкнуть по нему, чтобы сфокусироваться на нем, запустить скрипт типа, переместить его на ползунок, удерживать мышью на нем во время перетаскивания, высвобождая его по правильному position & click on the submitbutton – GroundZero

+0

Теперь мы работаем с мышью. Похоже, проблема заключается в загрузке позиций из xml-файла – GroundZero

0

Я исправил эту проблему, используя текстовый файл.
Это не решение, которое я хотел, но это работает ...

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; 
} 

И читать позиции:

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(); 
}