2012-05-22 2 views
0

Короче говоря, я пытаюсь автоматизировать некоторые вещи, когда мой компьютер загружается. Я думал, что я напишу консольное приложение C# для этого, а затем добавлю его в задачу расписания в окнах, которые будут выполняться при загрузке. Моя проблема заключается в одной программе, она требует пароля и не имеет возможности открываться через командную строку. Таким образом, его необходимо ввести вручную. Моя мысль заключалась в том, чтобы получить мой пароль из базы данных KeePass и использовать SendKeys для ввода пароля и входа в программу. Проблема, с которой я сталкиваюсь, - это время, необходимое для загрузки; У меня нет способа обнаружить, когда интерфейс GUI загружен и готов для моих SendKeys. Есть ли способ обнаружить это? Я предполагаю, что все, с чем мне нужно работать, это класс «Process», так как это то, что я использовал для запуска программы. Также обратите внимание, что когда я запускаю исполняемый файл с помощью Process.Start(), программа создает другой процесс для входа в систему, но у него нет связанного окна, которое я вижу с помощью вызовов Windows API.C# SendKeys Ждать загрузки программы перед отправкой

Хорошо, что было давно, я могу повторно крышку ...

Проблема: От C# определить, когда программа третьей стороны загружена (то есть заставка исчезает и графический интерфейс готов для взаимодействия с пользователем - значение Я не могу просто положиться, если процесс запущен или нет). Кроме того, нет параметров командной строки для сторонней программы, или я просто запускаю ее с паролем в качестве аргумента.

Цель: Использовать SendKeys для автоматизации ввода пароля, но моя программа должна дождаться завершения загрузки третьей стороной.

Примечания: Использование C# .NET консольного приложения 3,5 НЕ обнаруживая нагрузки для моей собственной формы, но третья сторона в противном случае это было бы легко (т.е. form_loaded событие ...)

Спасибо за глядя на мой вопрос , если вы хотите получить более подробную информацию или что-нибудь, дайте мне знать.

UPDATE:

Проблема решена! Два ответа, которые я получил в сочетании, чтобы дать мне решение, которое я хотел. Поэтому, если кто-нибудь встретит это позже, вот что я сделал, чтобы заставить его работать.

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

// 
// IMPORTANT Windows API imports.... 
// 

[DllImport("user32.dll", SetLastError = true)] 
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint procId); 

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

[DllImport("user32.dll", SetLastError = true)] 
private static extern bool SetForegroundWindow(IntPtr hWnd); 


// When I get to this point in my code, I already had the password and window title... 
string password = "password"; 
string title = "window title"; 

// This gets a handle to the window I want where "title" is the text in the title 
// bar of the window as a string. 
// This is a Windows API function that must be imported by DLLImport 
// I had to get the handle this way because all I knew about the third party 
// window was the title, not the process name or anything... 
IntPtr hWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, title); 

// Now that I have a handle to the login window I used another windows API 
// call to get the process ID. 

// This windows API call gives me the Process ID as an out parameter and returns 
// the thread ID of the window. I don't use the thread it, but maybe you can... 
uint loginWindowProcId; 
uint loginWindowThreadId = GetWindowThreadProcessId(hWnd, out loginWindowProcId); 

// now I can just use .NET to find the Process for me... 
Process loginWindowProcess = null; 

if (0 != loginWindowProcId) 
{ 
    // get the process object 
    loginWindowProcess = Process.GetProcessById((int)loginWindowProcId); 

    // This right here is why I wanted the Process structure. It takes a 
    // little while for the client software to load and be ready. So here 
    // you wait for the window to be idle so you know it has loaded and can 
    // receive user input, or in this case keys from "SendKeys". 
    loginWindowProcess.WaitForInputIdle(); 

    // I use yet another windows API call to make sure that the login window 
    // is currently in the foreground. This ensures that the keys are sent 
    // to the right window. Use the handle that we started with. 
    SetForegroundWindow(hWnd); 

    // Now send the password to the window. In my case, the user name is 
    // always there from my windows credentials. So normally I would type in the 
    // password and press ENTER to login. But here I'll use SendKeys to mimic my 
    // behavior. 
    SendKeys.SendWait(password); // send password string 
    SendKeys.SendWait("{ENTER}"); // send ENTER key 

    // Now the client should be logging in for you! :) 

    // IMPORTANT NOTE 
    // If you are using a console application like I am, you must add a reference to 
    // System.Windows.Forms to your project and put "using System.Windows.Forms;" in 
    // your code. This is required to use the "SendKeys" function. 
    // 
    // Also this code is just for my testing (quick and dirty), you will want to write 
    // more checks and catch errors and such. You should probably give the 
    // WaitForInputIdle a timeout etc... 
} 

ответ

0

Вы можете проверить с процессом. WaitForInputIdle после начала процесса, и ждать, пока не будет полностью запущен, вот простой пример:

http://msdn.microsoft.com/en-us/library/xb73d10t%28v=vs.71%29.aspx

+0

Спасибо за предложение, мне передали еще один проект, но я вернулся к этому сейчас. Я дам этот снимок завтра и посмотрю, сможет ли он работать с тем, что у меня есть. – akagixxer

0

Попробуйте посмотреть на что: http://www.acoolsip.com/a-cool-blog/science-and-technology/151-c-sending-commands-to-independent-windows.html

вы можете проверить, если окно показано (используя ссылку), а затем отправка сообщения (также по ссылке)

+0

Спасибо, я дам ему выстрелили. Это немного другой подход к тому, что я принимаю. Может быть, это то, что мне нужно! – akagixxer

+0

Оба ответа очень помогли вам! – akagixxer

Смежные вопросы