2010-05-14 17 views
8

Estoy usando el siguiente código para eliminar la barra de título de una aplicación, que funciona perfectamente para el bloc de notas. Ahora quiero eliminar la barra de menú también. ¿Cómo lograrlo?¿Cómo eliminar MenuBar de una aplicación usando Windows API?

//Finds a window by class name 
     [DllImport("USER32.DLL")] 
     public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

     //Sets a window to be a child window of another window 
     [DllImport("USER32.DLL")] 
     public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

     //Sets window attributes 
     [DllImport("USER32.DLL")] 
     public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

     //Gets window attributes 
     [DllImport("USER32.DLL")] 
     public static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

     [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
     static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 


     //assorted constants needed 
     public static int GWL_STYLE = -16; 
     public static int WS_BORDER = 0x00800000; //window with border 
     public static int WS_DLGFRAME = 0x00400000; //window with double border but no title 
     public static int WS_CAPTION = WS_BORDER | WS_DLGFRAME; //window with a title bar 

     public void WindowsReStyle() 
     { 
      Process[] Procs = Process.GetProcesses(); 
      foreach (Process proc in Procs) 
      { 

       if (proc.ProcessName.StartsWith("notepad")) 
       { 
        IntPtr pFoundWindow = proc.MainWindowHandle; 
        int style = GetWindowLong(pFoundWindow, GWL_STYLE); 
        SetWindowLong(pFoundWindow, GWL_STYLE, (style & ~WS_CAPTION)); 
       } 
      } 
    } 
+0

Necesito lo mismo. Pero al aplicar este código en mi aplicación, oculta la barra de título al hacer alguna interacción con el mouse (como arrastrar y soltar, etc.). ¿Puedes sugerirme la causa raíz? –

Respuesta

7

No se puede ocultar ellos, tendrá que eliminarlos mediante la API en cambio, tu caso es distinto en el resultado de hacer esto;

[DllImport("USER32.DLL")] 
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

    [DllImport("user32.dll")] 
    static extern IntPtr GetMenu(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    static extern int GetMenuItemCount(IntPtr hMenu); 

    [DllImport("user32.dll")] 
    static extern bool DrawMenuBar(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags); 

    public static uint MF_BYPOSITION = 0x400; 
    public static uint MF_REMOVE = 0x1000; 

    public static void WindowsReStyle() { 
     Process[] Procs = Process.GetProcesses(); 
     foreach (Process proc in Procs) { 

      if (proc.ProcessName.StartsWith("notepad")) { 
       //get menu 
       IntPtr HMENU = GetMenu(proc.MainWindowHandle); 
       //get item count 
       int count = GetMenuItemCount(HMENU); 
       //loop & remove 
       for (int i = 0; i < count; i++) 
        RemoveMenu(HMENU, 0, (MF_BYPOSITION | MF_REMOVE)); 

       //force a redraw 
       DrawMenuBar(proc.MainWindowHandle); 
      } 
     } 
    } 
+0

¿me puede decir las constantes necesarias para este código? – Anuya

+1

actualización de la publicación anterior –

Cuestiones relacionadas