На самом деле я не думаю, что имеет значение, что окно является частью приложения UWP.
Вы можете восстановить главное окно Mail с помощью вызова Win32 ShowWindow (hwnd, SW_RESTORE). Однако хитрость в том, что вы должны найти правильное окно. В Spy ++ вы можете видеть, что это некое окно, которое имеет класс окна «ApplicationFrameWindow», связанный с процессом с именем модуля «APPLICATIONFRAMEHOST» - это должны быть артефакты реализации UWP.
Чтобы найти конкретное «ApplicationFrameWindow», которое является главным окном Mail, не полагаясь на что-то изменчивое или эфемерное, как текст окна, я обнаружил, что правильное окно является владельцем одного из окон, связанных с процессом HxOutlook.exe , Там могут быть менее запутанные, чтобы сделать это, но следующие работы. Это родное приложение командной строки, очевидно:
#include <Windows.h>
#include <psapi.h>
#include <tchar.h>
#include <vector>
DWORD GetProcessByName(const TCHAR* target_process_name)
{
DWORD processes[1024], bytes_returned;
if (!EnumProcesses(processes, sizeof(processes), &bytes_returned))
return 0;
int n = bytes_returned / sizeof(DWORD);
for (int i = 0; i < n; i++) {
auto pid = processes[i];
TCHAR process_name[MAX_PATH] = TEXT("");
HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (process) {
HMODULE module;
DWORD bytes_needed;
if (EnumProcessModules(process, &module, sizeof(module), &bytes_needed)) {
GetModuleBaseName(process, module, process_name, sizeof(process_name) / sizeof(TCHAR));
if (_tcscmp(process_name, target_process_name) == 0)
return pid;
}
}
}
return 0;
}
struct HwndFinder {
std::vector<HWND> windows;
DWORD pid;
HwndFinder(DWORD pid) : pid(pid)
{}
};
BOOL CALLBACK EnumWindowsFindProcessWindow(HWND hwnd, LPARAM lParam)
{
DWORD pid;
HwndFinder* param = reinterpret_cast<HwndFinder*>(lParam);
GetWindowThreadProcessId(hwnd, &pid);
if (pid == param->pid) {
param->windows.push_back(hwnd);
}
return TRUE;
}
std::vector<HWND> GetWindowsFromProcessID(DWORD pid)
{
HwndFinder param(pid);
EnumWindows(EnumWindowsFindProcessWindow, reinterpret_cast<LPARAM>(¶m));
return param.windows;
}
int main()
{
auto mail_process = GetProcessByName(TEXT("HxOutlook.exe"));
auto windows = GetWindowsFromProcessID(mail_process);
for (auto window : windows) {
auto owner = GetWindow(window, GW_OWNER);
if (owner)
ShowWindow(owner, SW_RESTORE);
}
return 0;
}
Он находит идентификатор процесса для "HxOutlook.exe", перечисляет все окна, в которых WNDPROC для окна выполняется в потоке, принадлежащем этому процессу, и затем показывает окна всех окон, которые владеют этими окнами, одно из которых главное почтовое окно.
Вы можете сделать что-то подобное выше с помощью вызова платформы, или найти более простой способ, или поместить приведенный выше код в DLL и вызывать его в C # через DLLImport.