Aplicação na frente de todas

04/12/2009

5

Olá, Tenho uma aplicação em que preciso que fique por cima de qualquer outra que abra de forma automática ou mesmo que abra por conta do usuário. Mais ou menos o que ocorre do aplicações de sistemas de vigilância com câmeras, que mesmo que o usuário deseje minimiza ou abrir outra coisa por cima, ele não conseguirá pois a aplicação ficará sempre por cima.   Alguém sabe como crio este recurso num programa feito em Delphi?   vlw    
Responder

Posts

Ola

Eu setaria as seguintes propriedades assim

  BorderIcons = []
  BorderStyle = bsSingle
  FormStyle = fsStayOnTop
  WindowState = wsMaximized


O unico problema é que da pro usuario abrir o menu iniciar e abrir qquer programa, mas ainda assim seu projeto estara sempre visivel....
Responder

09/12/2009

Robson Tavares

Exato... dessa maneira não atende ao meu cliente. Também já tentei usar a função abaixo, mas não funcionou:             SetWindowPos(Self.Handle,
          HWND_NOTOPMOST,
          0, 0, 0, 0,
          SWP_NOMOVE OR
          SWP_NOACTIVATE OR
          SWP_NOSIZE);   Como tenho vários forms abertos ao mesmo tempo na minha aplicação, esta função acima serve apenas para manter o form corrente sobre todo o resto. Ou seja, se tiver três forms abertos, os dois de baixo poderão ser sobrepostos por outra aplicação e apenas o primeiro de cima não será.   Alguém tem outra sugestão?    
Responder

09/12/2009

Vitor Rubio

  As funções da api, como SetWindowPos, ou ShowWindow vão funcionar para apenas um formulario.

Você quer que sua aplicação fique na frente de todas ou quer impedir que o usuário abra qualquer aplicação que não seja a sua?

O que você pode fazer é iniciar o sistema com uma form transparente, e a partir dessa abrir uma form mdi, modal, always on top.

Todas as outras forms você pode abrir dentro da mdi, como mdi childs, ou usar SetParent para  definir a form mdi como parend de qualquer outra.

Se não quiser que outros programas sejam abertos você pode colocar restrições no usuário, no registro, ou usar ShowWindow para fazer "sumir" as janelas de sistema do windows.

Também pode definir o seu programa como sendo o "shell" do windows (isso era possivel no win98, não sei se isso é possivel nos atuais).
Responder

09/12/2009

Robson Tavares

Olá Vitor,   As funções da api, como SetWindowPos, ou ShowWindow vão funcionar para apenas um formulario.
sim, verifiquei isso.
Você quer que sua aplicação fique na frente de todas? Exato.   ou quer impedir que o usuário abra qualquer aplicação que não seja a sua? Não tem necessidade

O que você pode fazer é iniciar o sistema com uma form transparente, e a partir dessa abrir uma form mdi, modal, always on top. Todas as outras forms você pode abrir dentro da mdi, como mdi childs, ou usar SetParent para  definir a form mdi como parend de qualquer outra.
Minha aplicação não pode ser MDI
Se não quiser que outros programas sejam abertos você pode colocar restrições no usuário, no registro, ou usar ShowWindow para fazer "sumir" as janelas de sistema do windows. O problema não é esse. Por exemplo: minha aplicação está rodando e aberta sobre todas as outras e precisa ser dessa forma. Aí o cliente acessa via Logmein o PC onde está rodando a aplicação, e quando ele saí do Logmein fica uma tela sobreposta na minha aplicação. Ocorre o mesmo quando o Logmein emite avisos de atualização, etc (e o problema não é só do Logmein, pois outros programas como Acrobat, Flash, etc causam o mesmo problema). Outra coisa: no Windows Vista, fica aquele logotipo no canto de baixo aparecendo sobre a aplicação e também não consegui tirar aquilo nem fazer com que a aplicação sobreponha o logotipo.

Também pode definir o seu programa como sendo o "shell" do windows (isso era possivel no win98, não sei se isso é possivel nos atuais).
Não é possível.
Responder

11/12/2009

Vitor Rubio

  Não sei se isso resolve, mas se o usuario não puder clicar na janela para colocar ela na frente das outras (é isso que acontece?) tente usar showwindow e setforegroundwindow com o handle da sua form principal. Talvez coloque isso num timer (gambiarra), ou no evento "onDeactivate" da form principal.

Não sei porque não pode ser modal, mas você pode simular modal sem ser de verdade, usando setparent. Você disse que sua aplicação é formada por três forms que formam um tipo de painel de controle, né? Então você pode colocar na sua form principal 3 Tpanels normais nas posições que você quer que as forms fiquem. Daí você pega os handles dos três e usa setparent para colocar as forms dentro dos panels.

Agora já está tarde, mas amanhã de manhã se você quiser eu posso fazer um exemplo.
Responder