Чтение переменных из XML для перемещения мыши - PullRequest
0 голосов
/ 03 апреля 2012

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

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

Именно поэтому я бы хотел, чтобы мои друзья написали позицию мыши в виде 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;

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

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

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();
}
0 голосов
/ 03 апреля 2012

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

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

См. Также:

Перемещение курсора мыши программно

...