Перемещение окна приложения UWP с помощью собственного кода C ++ - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь контролировать размер и положение приложения UWP (Windows Mixed Reality Portal) через отдельное приложение.В моем случае я использую консольное приложение для простоты.Командный скрипт также будет работать для того, чего я хочу достичь.

Я пробовал Windows API, такие как MoveWindow, SetWindowPos, но они не работают должным образом, и GetWindowRect возвращает 0,0,0,0 прямоугольника.Я могу получить дескриптор окна, но не могу изменить размер / положение.

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

#include <iostream>
#include <ShObjIdl.h>
#include <atlbase.h>
#include <tlhelp32.h>

BOOL CALLBACK EnumWindowsProcBack(HWND windowHandle, LPARAM lParam) {
    DWORD searchedProcessId = (DWORD)lParam;  // This is the process ID we search for (passed from BringToForeground as lParam)
    DWORD windowProcessId = 0;
    GetWindowThreadProcessId(windowHandle, &windowProcessId); // Get process ID of the window we just found
    if (searchedProcessId == windowProcessId) {  // Is it the process we care about?
        //std::cout << "moving window..\n";
        //bool s=MoveWindow(windowHandle, 0, 0, 1920, 1080, true);
        SetWindowPos(
            windowHandle,
            HWND_TOP,
            0,
            0,
            600,
            600,
            SWP_NOSIZE
        );
        return FALSE;  // Stop enumerating windows
    }
    return TRUE;  // Continue enumerating
}

void MoveWindowToFixedLocation(DWORD processId) {
    EnumWindows(&EnumWindowsProcBack, (LPARAM)processId);
}

HRESULT LaunchApp(LPCWSTR AUMID, DWORD &pid)
{
    HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    if (FAILED(hr))
    {
        wprintf(L"LaunchApp %s: Failed to init COM. hr = 0x%08lx \n", AUMID, hr);
    }
    {
        CComPtr<IApplicationActivationManager> AppActivationMgr = nullptr;
        if (SUCCEEDED(hr))
        {
            hr = CoCreateInstance(CLSID_ApplicationActivationManager, nullptr,
                CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&AppActivationMgr));
            if (FAILED(hr))
            {
                wprintf(L"LaunchApp %s: Failed to create Application Activation Manager.hr = 0x%08lx \n", AUMID, hr);
            }
        }
        if (SUCCEEDED(hr))
        {
            //DWORD pid = 0;
            hr = AppActivationMgr->ActivateApplication(AUMID, nullptr, AO_NONE,
                &pid);
            if (FAILED(hr))
            {
                wprintf(L"LaunchApp %s: Failed to Activate App. hr = 0x%08lx \n", AUMID, hr);
            }
        }
    }
    CoUninitialize();
    return hr;
}


int main() {

    DWORD pid = 0;
    LaunchApp(L"Microsoft.Windows.HolographicFirstRun_cw5n1h2txyewy!App", pid);
    //cout << pid;
    MoveWindowToFixedLocation(pid);
}

1 Ответ

0 голосов
/ 22 мая 2019

Это невозможно. Приложение UWP работает в собственной закрытой среде. Настольное приложение не может послать ему сигнал.

...