Ocultar el botón de la barra de tareas de un formulario sin usar WS_EX_TOOLWIN
Pregunta
Necesito ocultar un formulario de Windows de la barra de tareas pero no puedo usar WS_EX_TOOLWINDOW
porque necesito el menú del sistema y los botones min / max en la barra de título del formulario.
Si cambio el formulario a una ventana de herramientas en tiempo de ejecución, el diseño del formulario se rellena. Al buscar en la Web, veo que VB tiene una propiedad ShowInTaskbar y me pregunto si esto haría lo que quiero y si se puede implementar en Delphi 2006. Además, este proyecto es un servidor COM y no tiene MainForm, etc.
Solución
Hay una discusión interesante sobre este problema exacto aquí (desde una perspectiva VB6).
La parte más relevante desde la perspectiva de su pregunta es:
" Cuando crea una ventana, la barra de tareas examina el estilo extendido de la ventana para ver si WS_EX_APPWINDOW (& amp; H40000) o WS_EX_TOOLWINDOW (& amp; H80) El estilo está activado. Si WS_EX_APPWINDOW está activado, la barra de tareas muestra un botón para la ventana, y si WS_EX_ TOOLWINDOW está activado, la barra de tareas no muestra un botón para la ventana. Una ventana nunca debe tener ambas Estos estilos extendidos. Si la ventana no tiene ninguno de estos estilos, la barra de tareas decide crear un botón si la ventana no es propiedad y no crear un botón si la ventana es propiedad. "
Por cierto, utiliza el GetWindow Función API con el indicador GW_OWNER para determinar si una ventana es propiedad.
Otros consejos
Gracias a Stu por ponerme a la respuesta tan rápido. En mi caso, tuve que agregar manualmente el identificador del formulario propietario en CreateParams, pero eso puede no ser necesario en otros casos / normales.
procedure TfrmWord2Site.CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := <your owner form>.Handle;
Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
end;
Gracias a http://www.scalabium.com/faq/dct0096.htm .
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOW);
end;
Lo probé y funcionó con Delphi2006. Y el menú de Windows y los botones min / max siguen siendo visibles.
en Delphi XE (2010) esto funciona perfectamente: deberías editar el formulario principal,
program prog;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
begin
Application.Initialize;
// this value is set to "true", but you shoud set it "false"
Application.MainFormOnTaskbar := false;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
(para esta búsqueda de formulario principal en la ventana de "vista de modelado")
después de esto, vaya a unit1.pas, su unidad de formularios principal y "OnShow" evento de form1 do:
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
esto ayudará, tuve el mismo problema, busqué en toda la red pero sin resolver
Resolvió mis problemas en esta área con BordersStyle bsDialog / bsToolWindow (pero luego no necesitaba el min / max ...). Pero me pregunto por qué debería combinar estos atributos. ¿No confundirá al usuario "normal"?
Estoy buscando un fragmento de código para integrar un cuadro de texto a la barra de tareas de Windows.
Planeo crear una barra de herramientas que no puedo 'integrar en la barra de tareas.
Gracias por tu ayuda pj
Una forma de hacer esto en C # es:
ShowWindow(_window, SWHide);
int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);
ShowWindow(_window, SWShow);