Загрузка Окна WPF, не показывая его

Base64 требует заполнения с = в конце, не каждый инструмент добавляет их.

string  s = // some base64 witout padding;
s = s.PadRight(s.length + (s.length * 3) % 4, '=');  // add padding
var data = Convert.FromBase64(s);
50
задан Dave Clemmer 11 August 2011 в 06:05
поделиться

9 ответов

If you are targeting .NET 4.0 you can make use of the new EnsureHandle method available on the WindowInteropHelper:

public void InitHwnd()
{
    var helper = new WindowInteropHelper(this);
    helper.EnsureHandle();
}

(thanks to Thomas Levesque for pointing this out.)

If you are targeting an older version of the .NET Framework, the easiest way is to show the window to get to the HWND while setting a few properties to make sure that the window is invisible and doesn't steal focus:

var window = new Window() //make sure the window is invisible
{
    Width = 0,
    Height = 0,
    WindowStyle = WindowStyle.None,
    ShowInTaskbar = false,
    ShowActivated = false
};
window.Show();

Once you want to show the actual window you can then set the Content, the size and change the style back to a normal window.

64
ответ дан 7 November 2019 в 10:42
поделиться

Запускают Окно Wpf в режим Hidden :

WpfWindow w = new WpfWindow() { Visibility = Visibility.Hidden };
//w.Show();

Запускают Окно Wpf в режим Visible :

WpfWindow w = new WpfWindow();
w.Show();
0
ответ дан 7 November 2019 в 10:42
поделиться

Класс WindowInteropHelper должен позволить вам получить HWND для окна WPF.

MyWindow win = new MyWindow();
WindowInteropHelper helper = new WindowInteropHelper(win);

IntPtr hwnd = helper.Handle;

Документация MSDN

0
ответ дан 7 November 2019 в 10:42
поделиться

Я никогда не пробовал делать то, что делаете вы, но если вам нужно показать окно, чтобы получить HWND, но вы не хотите, чтобы показывал его, установите непрозрачность окна равным 0. Это также предотвратит выполнение проверки попадания. Затем у вас может быть общедоступный метод в окне для изменения непрозрачности на 100, когда вы хотите сделать его видимым.

5
ответ дан 7 November 2019 в 10:42
поделиться

Это грязный прием, но он должен работать и не имеет недостатков, связанных с изменением непрозрачности:

  • установите WindowStartupLocation на вручную
  • устанавливает свойства Top и Left где-нибудь за пределами экрана
  • устанавливает ShowInTaskbar в значение false, чтобы пользователь не осознавал, что существует новое окно
  • Показать и Скрыть окно

Теперь у вас должна быть возможность получить HWND

EDIT: другой вариант, возможно, лучше: установите ShowInTaskBar на false и с WindowState на Minimized , затем показать: это не будет видно вообще

16
ответ дан 7 November 2019 в 10:42
поделиться

Другой вариант, похожий на установку непрозрачности на 0, - установить размер на 0 и установить положение вне экрана. Для этого не потребуется AllowsTransparency = True.

Также помните, что после того, как вы показали его один раз, вы можете скрыть его и все равно получить hwnd.

0
ответ дан 7 November 2019 в 10:42
поделиться

Я абсолютно ничего не знаю о WPF, но не могли бы вы создать окно только для сообщений , используя другие средства (например, PInvoke) для получения сообщения WM_HOTKEY? Если да, то как только вы получите WM_HOTKEY, вы сможете запустить окно WPF оттуда.

3
ответ дан 7 November 2019 в 10:42
поделиться

Установите размер окна 0 x 0 пикселей, установите для ShowInTaskBar значение false, покажите его, а затем при необходимости измените его размер.

0
ответ дан 7 November 2019 в 10:42
поделиться

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

    SetParent(hwnd, (IntPtr)HWND_MESSAGE);

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

    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hwnd, IntPtr hwndNewParent);

    private const int HWND_MESSAGE = -3;

    private IntPtr hwnd;
    private IntPtr oldParent;

    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;

        if (hwndSource != null)
        {
            hwnd = hwndSource.Handle;
            oldParent = SetParent(hwnd, (IntPtr)HWND_MESSAGE);
            Visibility = Visibility.Hidden;
        }
    }

    private void OpenWindowMenuItem_Click(object sender, RoutedEventArgs e)
    {
        SetParent(hwnd, oldParent);
        Show();
        Activate();
    }

Для меня решение установить ширину, высоту на ноль и стиль на none не сработало, так как оно все еще показывало крошечное окно с раздражающей тенью того, что кажется границей вокруг окна 0x0 (проверено в Windows 7). Поэтому я предлагаю этот альтернативный вариант.

17
ответ дан 7 November 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: