Common How-To#
- Get top level window
C++
FSlateApplication::Get().GetActiveTopLevelWindow()
FSlateApplication::Get().GetInteractiveTopLevelWindows()
FSlateApplication::Get().GetAllVisibleWindowsOrdered(AllWindows);
TSharedPtr<SWindow> ParentWindow = FSlateApplication::Get().FindWidgetWindow(AsShared());
// If the main frame exists parent the window to it
TSharedPtr< SWindow > ParentWindow;
if (FModuleManager::Get().IsModuleLoaded( "MainFrame" ) )
{
IMainFrameModule& MainFrame = FModuleManager::GetModuleChecked<IMainFrameModule>( "MainFrame" );
ParentWindow = MainFrame.GetParentWindow();
}
TSharedPtr<SWindow> ParentWindow = FGlobalTabmanager::Get()->GetRootWindow();
if (ParentWindow.IsValid())
{
// Parent the window to the main frame
FSlateApplication::Get().AddWindowAsNativeChild(NewSlateWindow, ParentWindow.ToSharedRef());
}
else
{
FSlateApplication::Get().AddWindow(NewSlateWindow);
}
- Destroy window
C++
FSlateApplicationBase::Get().RequestDestroyWindow(Window);
- Add as child window
C++
FSlateApplication::Get().AddWindowAsNativeChild(BrowserWindowWidget, ParentWindow.ToSharedRef());
- Get Application Slate Renderer (D3D, OpenGL, etc)
C++
FSlateApplication::Get().GetRenderer()
Is it possible to choose the default screen in a multi monitor configuration?#
Reference From https://answers.unrealengine.com/questions/294650/is-it-possible-to-choose-the-default-screen-in-a-m.html
C++
// Move window to the corresponding monitor
if (GEngine && GEngine->GameViewport) {
int MonitorNumber = 1;
FParse::Value(FCommandLine::Get(), L"monitor=", MonitorNumber);
FDisplayMetrics Display;
FDisplayMetrics::GetDisplayMetrics(Display);
int8 MonitorIndex = MonitorNumber - 1;
int32 CurrentMonitorWidth = Display.MonitorInfo[MonitorIndex].NativeWidth;
float WidthPosition = (MonitorIndex)*Display.PrimaryDisplayWidth - CurrentMonitorWidth;
float HeightPosition = 0.0f;
FVector2D WindowPosition = FVector2D(WidthPosition, 0.f);
GEngine->GameViewport->GetWindow()->MoveWindowTo(WindowPosition);
}
Reference From https://answers.unrealengine.com/questions/294650/is-it-possible-to-choose-the-default-screen-in-a-m.html
Everything happens in UGameEngine::CreateGameViewport() which can be found in Engine\Source\Runtime\Engine\Private\GameEngine.cpp. Now look at the following lines of code :
C++
// SAVEWINPOS tells us to load/save window positions to user settings (this is disabled by default)
int32 SaveWinPos;
if (FParse::Value(FCommandLine::Get(), TEXT("SAVEWINPOS="), SaveWinPos) && SaveWinPos > 0 )
{
You can see the Window->MoveWindowTo() function call which is exactly what we want. So after these lines I added the following :
C++
FDisplayMetrics DisplayMetrics;
FSlateApplication::Get().GetDisplayMetrics(DisplayMetrics);
int MonitorNumber = 0;
FParse::Value(FCommandLine::Get(), L"monitor=", MonitorNumber);
//Reset to primary if the monitor index is invalid
if( MonitorNumber >= DisplayMetrics.MonitorInfo.Num() || MonitorNumber < 0 )
{
FString Message = "_____ Incorrect monitor index, will use primary screen instead";
UE_LOG(LogTemp, Warning, TEXT( "%s" ), *Message);
MonitorNumber = 0;
}
//If monitor index is 0, we default to primary screen
if( MonitorNumber == 0 )
{
for( int i = 0; i < DisplayMetrics.MonitorInfo.Num(); i++ )
{
FString MonitorInfo = "_____ Found monitor \"" + DisplayMetrics.MonitorInfo[i].Name + "\" (is primary : ";
MonitorInfo += FString::FromInt( DisplayMetrics.MonitorInfo[i].bIsPrimary ) + FString(")");
UE_LOG(LogTemp, Warning, TEXT( "%s" ), *MonitorInfo);
if( DisplayMetrics.MonitorInfo[i].bIsPrimary )
{
MonitorNumber = i + 1;
}
}
}
Reference From http://www.froyok.fr/blog/2018-01-ue4-specify-default-monitor-at-launch