Member 13097868 Ответов: 1

Как использовать низкоуровневый winapi для автоматизации приложения


Build a console application that automates a Windows based application which adds , subtracts, multiplies and divides two integers.The automation should be able to launch the application, enter two integers and select an operation and click equals button


Что я уже пробовал:

Мне удалось закодировать приложение, которое выполняет операции между целыми числами. Не мог написать код для автоматизации его через консоль.Код, который я написал для первой части, таков:
private void btnTotal_Click(object sender,EventArgs e)
        {
            try
            {
                double firstnum= Convert.ToDouble(txtFirstNumber.Text);
				double secondnum=Convert.ToDoubletxtSeconNumber.Text);
				char operator;
                switch (operator)
                {
                    case "+":
                        {                     
							lblResult.visible=true;
							lblResult.text="Result is: " + (firstnum+secondnum).ToString();
                            break;
                        }
                    case "-":
                        {
                            lblResult.visible=true;
							lblResult.text="Result is: " + (firstnum-secondnum).ToString();
                            break;
                        }
                    case "*":
                        {
							lblResult.visible=true;
							lblResult.text="Result is: " + (firstnum*secondnum).ToString();
                            break;
                        }
                    case "/":
                        {
							if (secondnum != 0) 
							{ 
								lblResult.visible=true;
								lblResult.text="Result is: " + (firstnum*secondnum).ToString(); 
							} 
							else 
							{ 
								MessageBox.Show("Can't divide by zero"); 
							} 
							break;
                        }
					default:
                        {
                            MessageBox.Show("Invalid Input"); 
                            break;
                        }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);  
            }
        }

[no name]

Снова.... какой твой специфический вопрос?

Member 13097868

Мой вопрос заключается в том, как вызвать мою форму windows (которую я создал выше) из моего консольного приложения, используя функции WinAPI и User32.dll( это то, что упоминается в моем задании)

F-ES Sitecore

Это ваша домашняя работа для вашего курса, поэтому они хотят, чтобы вы использовали методы, которым вас научили. Мы не знаем, что это за техника, а если бы и знали, то все равно не будем делать за вас домашнее задание.

Member 13097868

Это задание, у меня нет никакого опыта в автоматизации. Я старался изо всех сил и работал над этим с четверга. Я ожидаю не кода, а скорее руководства. Если вы сможете вести меня, я буду вам очень признателен. У меня есть 0-летний опыт работы в dotnet, все еще пытался написать приведенный выше код. Так что, по крайней мере, не демотивируйте, если не помогайте.

Member 13097868

И да к вашему сведению я занимаюсь самообучением чтобы выучить dotnet и такие задания я стараюсь искать чтобы узнать больше

Dave Kreskowiak

Это очень специфическое применение. Что именно вы изучаете, что относится к такому конкретному приложению?

Member 13097868

Я изучаю WinAPI и как автоматизировать windows form

Dave Kreskowiak

Если вы спрашиваете" как мне это сделать " после того, как изучили, как это сделать, вы не очень хорошо учитесь.

Member 13097868

У меня нет материала для ссылки, я погуглил об API, и там не так уж много об этом. Да, я спрашиваю "как мне это сделать", потому что не смог, может быть, я не такой опытный и умный, как вы все, но я могу задать вопрос, ища какого-то руководства. Разве этот форум не для начинающих?

Member 13097868

Я пытаюсь понять автоматизацию windows. Я уже создал форму, в которой я выполняю различные арифметические операции над двумя числами. Эту же форму я хочу автоматизировать через свое консольное приложение( например: форма открывается, само приложение вводит 6 и 0(эти значения будут жестко закодированы) и выбирает деление из выпадающего списка и после нажатия кнопки "равно" выводится результат.

Dave Kreskowiak

Итак, вы изучаете "автоматизацию Windows", а это значит, что у вас должен быть какой-то материал, который Вы читаете, который учит вас этому и тому, что делают функции API, правильно? Если нет, то я понятия не имею, что вы изучаете.

Теперь ваши учебные материалы по "автоматизации Windows" должны были рассказать вам, как это сделать. Правда?

Member 13097868

Я изучаю через msdn, codeproject blog, StackOverflow blog, везде есть другой метод, упомянутый, когда я пытался использовать эти методы, я не мог получить результат.У меня нет ни одного наставника, к которому я мог бы обратиться, когда не смог бы решить это задание. Поэтому я попытался обратиться за советом к этому форуму. Это похоже на то, что если у меня есть какой-то материал для изучения, я определенно должен быть в состоянии решить его? Мне действительно нужно некоторое руководство здесь, как подойти к " автоматизации Windows"

Dave Kreskowiak

Ладно, поскольку у вас на самом деле нет никаких учебных материалов, откуда взялось это "задание"?

[no name]

Ты имеешь в виду https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153 (v=против 85). aspx?

К вашему сведению, раздел "Что я пробовал" используется для того, чтобы рассказать нам, что вы пытались сделать для себя, прежде чем спрашивать здесь.

Member 13097868

Я уже упоминал о написанном мною коде, а что касается второй части, то я мало что мог сделать, попробовал использовать [Dllimprt "user32.dll"] попробовал написать консольное приложение со следующим кодом:
[STAThread]
статический недействительным главная(){
Приложение.EnableVisualStyles();
Приложение.Выполнить (новая форма());
}
и несколько разных вещей, которые я нашел в нескольких блогах youtube и т. д.

[no name]

Да и это не имеет никакого отношения к вашему вопросу!

Member 13097868

Я думаю, что вы мало чем можете помочь в этой теме. Я ценю ваше "не очень полезное" руководство ЗДЕСЬ.

[no name]

Что ж, я ценю ваш туманный вопрос о том, как научить меня программировать здесь. Мы здесь не для того, чтобы учить вас программированию.

Member 13097868

Под "не мог сделать много" (прежде чем вы неправильно истолкуете) я имею в виду отсутствие работоспособного решения, которое я мог бы найти. везде приводится пример вызова блокнота и калькулятора, но я не мог соответствующим образом манипулировать своим кодом, потому что у меня нет опыта работы в dotnet.

1 Ответов

Рейтинг:
7

Matt Comb

Я бы предложил вам использовать планировщик задач для выполнения консольного приложения windows или аналогичного приложения, но вам нужно будет исследовать вызовы api "findwindow" и "sendmessage".

-- Calling Application

[DllImport("user32.dll")]    
public static extern IntPtr FindWindow(string lpClassName, String lpWindowName);    
[DllImport("user32.dll")]    
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);    
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);

public void SendMessageToApp
{        
     uint id = RegisterWindowMessage("MyUniqueMessageIdentifier");
     IntPtr WindowToFind = FindWindow(null, "Form1");    
     Debug.Assert(WindowToFind != IntPtr.Zero);
     SendMessage(WindowToFind, id, IntPtr.Zero, IntPtr.Zero);
}

-- Receiving Application

class Form1 : Form
{
    [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
    static extern uint RegisterWindowMessage(string lpString);

    private uint _messageId = RegisterWindowMessage("MyUniqueMessageIdentifier");

    protected override void WndProc(ref Message m)
    {
       if (m.Msg == _messageId)
       {
           // do stuff

       }
       base.WndProc(ref m);
    }
}