2017-02-16 27 views
3

Я пытаюсь найти способ сохранить окно всегда сверху. (он должен быть в оконном режиме) В настоящее время я использую OpenTk.NetCore библиотека для создания окна в ядре .net. Можно ли использовать OpenTk для хранения этого окна сверху или есть другой способ? Она должна быть в .Net ядре...openTk .net core keep window всегда сверху

мой текущий код:

public class Display : GameWindow 
{ 
    public Display() : base(400, 300, GraphicsMode.Default) 
    { 
     //display window in top left corner 
     this.X = 0; 
     this.Y = 0; 
     //TODO : window should always been displayed on top 
     VSync = VSyncMode.On; 
     WindowBorder = WindowBorder.Hidden; //no title & border 
     //WindowState = WindowState.Fullscreen; 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     GL.ClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     GL.Enable(EnableCap.DepthTest); 
    } 
    protected override void OnResize(EventArgs e) 
    { 
     base.OnResize(e); 

     GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height); 

     Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI/4, Width/(float)Height, 1.0f, 64.0f); 
     GL.MatrixMode(MatrixMode.Projection); 
     GL.LoadMatrix(ref projection); 
    } 

    protected override void OnUpdateFrame(FrameEventArgs e) 
    { 
     base.OnUpdateFrame(e); 

     if (Keyboard[Key.Escape]) 
      Exit(); 
    } 

    protected override void OnRenderFrame(FrameEventArgs e) 
    { 
     base.OnRenderFrame(e); 

     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

     Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY); 
     GL.MatrixMode(MatrixMode.Modelview); 
     GL.LoadMatrix(ref modelview); 
     GL.Begin(PrimitiveType.Triangles); 

     GL.Color3(1.0f, 0.0f, 0.0f); GL.Vertex3(2.0f, 1.0f, 4.0f); 
     GL.Color3(1.0f, 0.0f, 0.0f); GL.Vertex3(1.2f, 1.0f, 4.0f); 
     GL.Color3(1.0f, 0.0f, 0.0f); GL.Vertex3(1.6f, 1.5f, 4.0f); 
     GL.End(); 

     SwapBuffers(); 
    } 
} 
public class Program 
{ 
    [STAThread] 
    public static void Main(string[] args) 
    {    
     /* 
     * The 'using' idiom guarantees proper resource cleanup. 
     * We request 30 UpdateFrame events per second, and 30 
     * RenderFrame events. 
     */ 
     using (Display display = new Display()) 
     { 
      display.Run(30.0,30.0); 
     } 

    } 
} 

ответ

1

OpenTK не имеет поддержки для этого. Вы можете обнаружить, когда фокус, положение, размер и т. Д. Изменились, но я не верю, что вы можете напрямую влиять на фокус.

Кроме того, по крайней мере, в Windows, на самом деле нет никакого «законного» способа достижения этого, в том смысле, что нет возможности гарантировать, что какая-либо одна программа в Windows всегда выше всех остальных. Вы можете попытаться выполнить различные действия, такие как обнаружение, когда фокус фокуса утерян (NativeWindow.FocusChanged), а затем вызвать некоторые функции user32, такие как SetForegroundWindow, BringWindowToTop и т. Д., Но это тяжелая битва и не рекомендуется. Возможно, что другие операционные системы/оконные менеджеры имеют различную поддержку для этого.

+0

Я читал о опции TopMost = true в .Net, которая может обрабатывать это в Windows обычно –

+0

Я считаю, что вы имеете в виду концепцию WinForms. Насколько я знаю, такой концепции в OpenTK нет. –

 Смежные вопросы

  • Нет связанных вопросов^_^