Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Из полноэкранного режима в оконный и наоборот

#c_sharp #winapi #net


Нужно программно перевести игру в полноэкранный режим и наоборот из полноэкранного
в оконный. Хэндл окна нахожу функцией FindWindowByCaption.
Если это возможно, покажите пожалуйста пример как это сделать. Спасибо.
P.s: сочетание клавиш Alt+Enter не срабатывает.
Перевести в полноэкранный режим у меня получилось так:
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr zeroOnly, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, long dwNewLong);

[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, long dwNewLong);

public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, long dwNewLong)
{
    return IntPtr.Size == 8
        ? SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
        : new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong));
}

public static void SetWindowFullScreen(string windowName)
{
    IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, windowName);

    SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP);
    SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_EX_TOPMOST);
    ShowWindow(hWnd, SW_SHOWMAXIMIZED);
}

А вот из полноэкранного обратно в оконный не получается :(    


Ответы

Ответ 1



Для такого рода задач существует утилита Spy ++ с помощью нее можете посмотреть значение окна и уже на основании этих данных производить поиск этого окна. Spy ++ идет в комплекте со студией Пример работы [пример]:http://www.pinvoke.net/default.aspx/user32.findwindow

Ответ 2



Ваша ошибка в том, что вы устанавливаете свои значения стилей, полностью игнорируя изначальные значения. Обычно стили добавляют с помощью OriginalStyle |= ExtraStyle и удаляют с помощью OriginalStyle &= ~ExtraStyle. Это, так сказать, правило хорошего тона, чтобы ничего не испортить. Чтобы проделать эти операции, нужно сначала получить исходные значения. А чтобы восстановить исходные значения, нужно эти исходные значения сохранить. Так что вперёд и с песней к GetWindowLong.

Комментариев нет:

Отправить комментарий