alexpsad Ответов: 1

Как отправить строки в программу с открытым окном, ожидающим ответа строки?


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

Я использую createProcess, чтобы открыть эту программу, и жду ответа.

Сразу после того, как я использую keybd_event, чтобы написать учетные данные, и все работает нормально.
Но я не злюсь, потому что это недельное решение, как только кто-то открывает окно во время работы программы, keybd_event будет писать в открытом окне, а не в том, что хочет.

Итак, как отправить строковую информацию в программу и заставить ее понять эту строку-вот вопрос, который я обычно знаю. Какие-нибудь подсказки и подсказки?

ПС: В приведенном ниже коде я не поставил класс клавиатуры, потому что он работает нормально.
Я выполняю два раза, в основном, функцию
executeCommandLine
чтобы проверить, действительно ли один ждет, пока другой закончит свою работу, чтобы начать.

Большое спасибо за ваше время.
АПН.

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

// The class works fine.
// If correctely used, It write a string in the front window windows
#include "keyboard.h"

bool executeCommandLine(LPCSTR path, LPSTR cmdLine, DWORD &exitCode){
   PROCESS_INFORMATION processInformation = {0};
   STARTUPINFO startupInfo                = {0};
   startupInfo.cb                         = sizeof(startupInfo);

   BOOL result = CreateProcess(NULL, cmdLine,
                               NULL, NULL, FALSE,
                               NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,
                               NULL, NULL, &startupInfo, &processInformation);

   if (!result){
      // CreateProcess() failed
      // Get the error from the system
      LPVOID lpMsgBuf;
      DWORD dw = GetLastError();
      FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                    NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);

      // Display the error
      string strError = (LPTSTR) lpMsgBuf;
      //TRACE(_T("::executeCommandLine() failed at CreateProcess()\nCommand=%s\nMessage=%s\n\n"), cmdLine, strError);

      // Free resources created by the system
      LocalFree(lpMsgBuf);

      // We failed.
      return FALSE;
   }
   else{
// Here is the moment I use the keyboard to write the login and password.
// It works fine, but it's a week solution, a need to send 2 different strings in two //dialogue boxes that opens one after another (once the ENTER key was pressed, in both //cases) when the process starts: one with the LOGIN and other with the PASSWORD
	   	keyboard keybd;
	   	Sleep(3000);
	   	keybd.text("LOGIN");
	   	keybd.press_enter(TRUE);
	   	Sleep(200);
	   	keybd.text("PASSWORD");
	   	keybd.press_enter(TRUE);

      // Successfully created the process.  Wait for it to finish.
      WaitForSingleObject( processInformation.hProcess, INFINITE );

      // Get the exit code.
      result = GetExitCodeProcess(processInformation.hProcess, &exitCode);

      // Close the handles.
      CloseHandle( processInformation.hProcess );
      CloseHandle( processInformation.hThread );

      if (!result){
         return FALSE;
      }

      // We succeeded.
      return TRUE;
   }
}

int main() {
	LPSTR command = LPSTR("command line text");
	DWORD exitCode;
// executeCommandLine two times.
// to verfy if the first waits for the second. It works fine.
	executeCommandLine(NULL, command, exitCode);
	executeCommandLine(NULL, command, exitCode);
	return 0;
}

1 Ответов

Рейтинг:
2

«_Superman_»

Вы можете попробовать отправить текст с помощью SendMessage к только что открытому окну.

1. Звоните CreateProcess[^] чтобы начать новый процесс.
2. Использование Функция enumwindows[^] для перечисления всех окон верхнего уровня.
3. Использование Метод getwindowthreadprocessid[^] чтобы получить идентификатор процесса перечисляемого окна.
4. Сопоставить идентификатор процесса с PROCESS_INFORMATION структура для подтверждения идентичности окна.
5. Использование вызов sendMessage[^] с WM_SETTEXT и текст для отправки отправить в окно дескриптора в EnumWindowsProc[^].