Base64 требует заполнения с =
в конце, не каждый инструмент добавляет их.
string s = // some base64 witout padding;
s = s.PadRight(s.length + (s.length * 3) % 4, '='); // add padding
var data = Convert.FromBase64(s);
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.
Запускают Окно Wpf в режим Hidden :
WpfWindow w = new WpfWindow() { Visibility = Visibility.Hidden };
//w.Show();
Запускают Окно Wpf в режим Visible :
WpfWindow w = new WpfWindow();
w.Show();
Класс WindowInteropHelper должен позволить вам получить HWND для окна WPF.
MyWindow win = new MyWindow();
WindowInteropHelper helper = new WindowInteropHelper(win);
IntPtr hwnd = helper.Handle;
Я никогда не пробовал делать то, что делаете вы, но если вам нужно показать окно, чтобы получить HWND, но вы не хотите, чтобы показывал его, установите непрозрачность окна равным 0. Это также предотвратит выполнение проверки попадания. Затем у вас может быть общедоступный метод в окне для изменения непрозрачности на 100, когда вы хотите сделать его видимым.
Это грязный прием, но он должен работать и не имеет недостатков, связанных с изменением непрозрачности:
WindowStartupLocation
на вручную
Top
и Left
где-нибудь за пределами экрана ShowInTaskbar
в значение false, чтобы пользователь не осознавал, что существует новое окно Показать
и Скрыть
окно Теперь у вас должна быть возможность получить HWND
EDIT: другой вариант, возможно, лучше: установите ShowInTaskBar
на false и с WindowState
на Minimized
, затем показать: это не будет видно вообще
Другой вариант, похожий на установку непрозрачности на 0, - установить размер на 0 и установить положение вне экрана. Для этого не потребуется AllowsTransparency = True.
Также помните, что после того, как вы показали его один раз, вы можете скрыть его и все равно получить hwnd.
Я абсолютно ничего не знаю о WPF, но не могли бы вы создать окно только для сообщений , используя другие средства (например, PInvoke) для получения сообщения WM_HOTKEY? Если да, то как только вы получите WM_HOTKEY, вы сможете запустить окно WPF оттуда.
Установите размер окна 0 x 0 пикселей, установите для ShowInTaskBar значение false, покажите его, а затем при необходимости измените его размер.
Вы также можете превратить окно в так называемое окно только для сообщений. Поскольку этот тип окна не поддерживает графические элементы, он никогда не будет отображаться. В основном это сводится к вызову:
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). Поэтому я предлагаю этот альтернативный вариант.