WPF запуск android приложений

Какие есть варианты для запуска android приложений (.apk) внутри wpf ?

Т.е. мне необходимо запустить 1/2/10 операционных систем Android, а на них запустить по 1 приложению (.apk) и чтобы всё было сгруппировано в одном окне WPF

Возможно есть какой то вообще другой подход.

Нужно производить различные манипуляции в этих приложениях.

  • Клики
  • Набор текста
  • И т.д.

Ответы (1 шт):

Автор решения: Daniil Loban

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

Однако на Windows используя WIN API на С++ можно в одно окно вставить другое (в том числе другую программу) однако это будет чисто визуальное объединение (не функциональное) хотя тем же WIN API можно было бы попробовать отсылать на эти окна события клавиатурного ввода и мыши.

Ниже примерный список нужных функций из winuser.h для использования WIN API

Для работы с окнами через WIN API нужно получить их индификаторы (HWND) можно использовать функцию поиска окон:

HWND FindWindowExA(
  HWND   hWndParent, // Рабочий стол имеет HWND = 0 
  HWND   hWndChildAfter,
  LPCSTR lpszClass,
  LPCSTR lpszWindow
);

Для надежности поиска HWND рабочего стола лучше использовать:

HWND GetDesktopWindow(); 

Вот функция для назначения одному окну другого родителя - окна в котором оно будет размещено:

HWND SetParent(
  HWND hWndChild,
  HWND hWndNewParent
);

Далее нужно спозиционировать встроенное окно в определенном месте относительно верхнего левого угла родительского окна:

BOOL SetWindowPos(
  HWND hWnd,
  HWND hWndInsertAfter,
  int  X,
  int  Y,
  int  cx,
  int  cy,
  UINT uFlags
);

Для взаимодействия с окнами (отсылки им событий мыши и клавиатуры):

UINT SendInput(
  UINT    cInputs,
  LPINPUT pInputs,
  int     cbSize
);

пример использования:

//**********************************************************************
//
// Посылает сообщение о нажатии Win + D чтобы свернуть все окна и показать
// рабочий стол. 
//
//**********************************************************************
void ShowDesktop()
{
    OutputString(L"Sending 'Win-D'\r\n");
    INPUT inputs[4] = {};
    ZeroMemory(inputs, sizeof(inputs));

    inputs[0].type = INPUT_KEYBOARD;
    inputs[0].ki.wVk = VK_LWIN;
   
    inputs[1].type = INPUT_KEYBOARD;
    inputs[1].ki.wVk = VK_D;

    inputs[2].type = INPUT_KEYBOARD;
    inputs[2].ki.wVk = VK_D;
    inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;

    inputs[3].type = INPUT_KEYBOARD;
    inputs[3].ki.wVk = VK_LWIN;
    inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;

    UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
    if (uSent != ARRAYSIZE(inputs))
    {
        OutputString(L"Произошла ошибка: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
    } 
}
→ Ссылка