Página 1 de 2

Maximizar uma Janela Externa

Enviado: 19 Mar 2018 19:33
por asimoes
Pessoal,

Temos uma aplicação feita em delphi que é um relatório, esse relatório tem os controles de janela minimizar, maximiza e fechar.

Essa aplicação é executada a partir de uma aplicação harbour/hwgui, o controle para saber se a aplicação delphi (relatório) já está rodando eu já fiz, eu preciso de uma função que maximize a tela delphi se o botão do relatório for clicado.

Maximizar uma Janela Externa

Enviado: 19 Mar 2018 19:54
por JoséQuintas

Código: Selecionar todos

#include "hbwin.ch"

wapi_ShowWindow( hWnd, WIN_SW_SHOWMAXIMIZED )

Maximizar uma Janela Externa

Enviado: 19 Mar 2018 21:18
por asimoes
Quintas,

Você só não informou como pegar o handle da janela externa usando wapi_*

Maximizar uma Janela Externa

Enviado: 19 Mar 2018 21:26
por asimoes
Já Tentei isso:

Mas não maximiza: seta vermelha, fiz um teste com Skype e o Gerenciador de Tarefas a função tá funcionando, restaura a tela minimizada.
Essa janela é um relatório feito em delphi, quando minimizado ao clicar no botão Impressão Relatório Expediente se estiver minimizado quero que a tela seja maximizada.
2018-03-19 21_22_33-.png

Código: Selecionar todos

HB_SHOWWINDOW( "Relatorio" )

#pragma BEGINDUMP

#include "windows.h"
#include "hbapi.h"
#include "hbapiitm.h"

HB_FUNC( HB_SHOWWINDOW )
{
   SetFocus( ( HWND) FindWindow( NULL, hb_parc(1) ) );
   SetForegroundWindow( ( HWND) FindWindow( NULL, hb_parc(1) ) );
   ShowWindow(( HWND) FindWindow( NULL, hb_parc(1) ), SW_RESTORE );
   ShowWindow(( HWND) FindWindow( NULL, hb_parc(1) ), SW_MINIMIZE );
   ShowWindow(( HWND) FindWindow( NULL, hb_parc(1) ), SW_RESTORE );
}

#pragma ENDDUMP

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 08:15
por rubens
Bom dia

ASimoes, só por curiosidade... porque você usa programas externos para gerar relatórios?

Rubens

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 08:27
por asimoes
Porque esse relatório busca informações em banco de dados externos e esse acesso é controlado

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 08:32
por asimoes
A questão ai é que não estou conseguindo manipular a janela externa, quando faz SetForegroundWindow ou SetFocus o outro comando para restaurar não funciona, fica da forma como tá na imagem postada, embora tenha testado com outros e tenha funcionado, enfim.

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 08:48
por marcosgambeta
Experimente usar a função PostMessage:

Para maximizar:

Código: Selecionar todos

PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
Para minimizar:

Código: Selecionar todos

PostMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 10:11
por asimoes
Ola Marcos,

Testei a função PostMessage mas não funcionou, essa janela que eu chamo é um relatório quickreport do delphi não sei se ajuda a informação

Tentei até SetForegroundWindow(hWnd); antes da PostMessage


A função que eu testei PostMessage mas não funciona

HB_SHOWWINDOW( "Relatorio" )

Código: Selecionar todos

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC( HB_SHOWWINDOW )
{
         HWND hWnd = FindWindow( NULL, hb_parc( 1 ) );
       
       PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
       
}

#pragma ENDDUMP

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 10:49
por marcosgambeta
Veja se está retornando um handle válido:

Código: Selecionar todos

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC( HB_SHOWWINDOW )
{
  HWND hWnd = FindWindow( NULL, hb_parc( 1 ) );

  if( hWnd )
  {
    PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
    hb_retl( 1 );
  }
  else
  {
    hb_retl( 0 );
  }
}
#pragma ENDDUMP
Deve retornar .T. se achar o handle da janela e .F. se não achar.

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 10:53
por rubens
Bom dia...

ASimoes...

Tenho essa rotina para fechar o aplicativo

Código: Selecionar todos

local Retorno := .f.
local oScriptObj
local oWmiService
local oListaProcess
local oProcessos
oScriptObj := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oWmiService := oScriptObj:ConnectServer()
oListaProcess := oWmiService:ExecQuery( "select * from Win32_Process where Name='" + _cExe + "'" )
for Each oProcessos in oListaProcess
   Retorno := .t.
	oProcessos:Terminate() // mata o _cEXE
next
return Retorno
Será que ao invés de oProcessos:Terminate(). não teria uma método oProcessos:Maximize()?
Alguém que entenda bem desse CreateObject() aí não poderia nos ajudar?
Eu tenho o mesmo problema com o acbrmonitor nas versões mais novas. Quando mando imprimir uma nota com preview, abre a nota mas fica minimizado.

Rubens

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 11:18
por asimoes
Rubens,

Infelizmente não tem esse método.

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 11:28
por asimoes
Marcos,

A função retornou .T.

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 12:03
por marcosgambeta
Baseado na imagem que você apresentou:

. a janela "Sistema de Controles de Expedientes Internos" é a janela principal (main) da aplicação

. a janela "Consulta de Expedientes" é uma janela de diálogo da aplicação

. a janela apontada pela seta vermelha é a janela que você quer restaurar (pela forma como está minimizada, ela deve ser 'filha' (child) da aplicação)

A janela "Consulta de Expedientes" é modal ? Pois me parece que algo está bloqueando a janela do relatório.

Maximizar uma Janela Externa

Enviado: 20 Mar 2018 12:09
por asimoes
Marcos,

. a janela "Consulta de Expedientes" é uma janela de diálogo da aplicação

É uma janela tipo dialog modal (hwgui)

. a janela apontada pela seta vermelha é a janela que você quer restaurar (pela forma como está minimizada, ela deve ser 'filha' (child) da aplicação)

É uma janela Delphi (quickreport) é somente o relatório não tem janela, já entra mostrado o relatório