Funções WAPI no Harbour.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Funções WAPI no Harbour.

Mensagem por cjp »

Não sei se entendi errado, mas aqui não funcionou.

Peguei este código do outro post:

Código: Selecionar todos

*********************
Function Focaliza_App
*********************
oWnd := SY_FindWindow("NO DO EXE OU DO TITULO DA JANELA")
SY_SwitchToThisWindow(oWnd,.f.)
SY_showWindow( oWnd, 9 )
Return Nil

#pragma BEGINDUMP

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

VOID SY_SwitchToThisWindow( HWND hWnd, BOOL fAltTab );
HB_FUNC( SY_FINDCONSOLEHANDLE ) //FindConsoleHandle
{
 HWND hwnd;
 AllocConsole();
  hwnd = FindWindowA("ConsoleWindowClass",NULL);
 hb_retnl( (LONG) hwnd );
}
HB_FUNC( SY_CLOSEWINDOW )
{
 hb_retl( CloseWindow( (HWND) hb_parnl(1) ) );
}

HB_FUNC( SY_FINDWINDOW )
{
 hb_retnl((ULONG) FindWindow( (LPCSTR)
 NULL, hb_parcx(1))) ;
}

HB_FUNC( SY_GETFOREGROUNDWINDOW )
{
 HWND hwnd;
 hwnd = GetForegroundWindow();
 hb_retnl( (LONG) hwnd );
}

HB_FUNC( SY_SHOWWINDOW )
{
 hb_retl( ShowWindow(
 (HWND) hb_parnl(1), hb_parni(2) ));
}

HB_FUNC( SY_SETFOREGROUNDWINDOW )
{
 hb_retl( SetForegroundWindow(
  (HWND) hb_parnl( 1 ) ) ) ;
}

HB_FUNC( SY_SWITCHTOTHISWINDOW )
{
 HWND hWnd;
 hWnd = (HWND) hb_parnl(1);
 hb_retl(SetForegroundWindow(hWnd));
}
#pragma ENDDUMP

return
Substitui o "NO DO EXE OU DO TITULO DA JANELA" pelo nome do meu aplicativo.

O que eu pretendia é que a janela do meu programa passasse a ser a primeira na área de trabalho, ou seja, ela ficasse na frente de todas.

Mas não é isso que está acontecendo. Ela até fica focalizada (com cor amarelada, piscando), na barra de tarefas inferior, mas não aparece na frente das demais.

Fiz algo errado?
Inacio de Carvalho Neto
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Funções WAPI no Harbour.

Mensagem por janio »

tem certeza q ta usando a função correta?

A função que pisca o exe na barra de tarefas eh uma, e a que da foco a janela eh outra.

Poste como vc ta chamando a função Focaliza_app

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Funções WAPI no Harbour.

Mensagem por cjp »

Certeza se é esta a correta eu não tenho; mas achei que seria.

Estou chamando simplesmente assim:

Código: Selecionar todos

focaliza_app()
Inacio de Carvalho Neto
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Funções WAPI no Harbour.

Mensagem por janio »

O que quis perguntar foi em que momento o seu sistema perde o foco e que vc deseja retomar o foco e como faz essa chamada.

Um teste simples e que aqui comigo funciona perfeitamente eh:

Código: Selecionar todos

// chama programa externo para o aplicativo perder o foco
ShellExecute("calc")

// aguarda alguns instantes enquanto a app externa abre e o sistema perde o foco
inkey(3)

// volta foco para o sistema
NomeAplic = "Sistema"
Focaliza_App( NomeAplic )

Código: Selecionar todos

Function Focaliza_App( NomeJanela )
oWnd := SY_FindWindow( NomeJanela )
SY_SwitchToThisWindow(oWnd,.f.)
SY_showWindow( oWnd, 9 )
Return Nil

Código: Selecionar todos

HB_FUNC( SY_FINDWINDOW )
{
   hb_retnl((ULONG) FindWindow( (LPCSTR) NULL, hb_parcx(1))) ;
}

HB_FUNC ( FINDWINDOW ) 
{ 
hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) ); 
} 
Outra coisa:
A função SY_FINDWINDOW faz chamada à função FindWindow. Porém, nao vi no seu codigo esta ultima.
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Funções WAPI no Harbour.

Mensagem por cjp »

A Find_Window não é da hbwin?

O teu exemplo não funcionou aqui.

Pra começar, dá erro na shellexecute na compilação. Não sei que função é esta.

Substituí por __run(), mas mesmo assim não funcionou.

Na verdade a perda do foco se dá por ação do usuário. O programa está aberto, mas ele está fazendo outra coisa no computador (exemplo: editando um texto no Word). Daí eu queria chamar a atenção do usuário para o programa, colocando-o na frente do texto.
Inacio de Carvalho Neto
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Funções WAPI no Harbour.

Mensagem por Toledo »

cjp escreveu:Pra começar, dá erro na shellexecute na compilação. Não sei que função é esta.
Sistemas de busca do fórum: https://pctoledo.org/forum/viewto ... 928#p86928

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Funções WAPI no Harbour.

Mensagem por cjp »

Ah, então é isso: eu não uso Minigui.
Inacio de Carvalho Neto
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Funções WAPI no Harbour.

Mensagem por Jairo Maia »

Olá Inácio,

Mas acho que você pode substituir a ShellExecute() pela Hb_OpenProcess( cPath + executavel.exe )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Funções WAPI no Harbour.

Mensagem por cjp »

Sim, a Hb_openprocess() funcionou para abrir o outro programa.

Mas o foco ainda não está voltando ao programa.
Inacio de Carvalho Neto
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Funções WAPI no Harbour.

Mensagem por janio »

São duas coisas que você precisa resolver:

1- aprender a dar foco ao seu sistema através de um teste simples como no exemplo a postei.

2- concluiu a etapa Acima? Funcionou? Então coloque um time no seu sistema pra q de tempos em tempos o seu sistema venha para o primeiro plano.

Eu, particularmente, não gosto dessa idéia de forçar sempre que o meu sistema esteja em foco. Se o usuário precisar fazer outra coisa neste mesmo computador ele num vai conseguir Nunca? Como ele vai digitar um email, por Exemplo?

Minha opinião eh q a função focalização se aplica Qndo de dentro de nosso sistema precisar chamar alguma apple externa e desejamos manter nosso aplicativo em primeiro plano. Mas o usuário por si abrir outra aplicação e eu forçar que meu aplicativo esteja sempre na Frente?!? Sei não...
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Funções WAPI no Harbour.

Mensagem por cjp »

aprender a dar foco ao seu sistema através de um teste simples como no exemplo a postei.
Este é o problema. Aqui não está funcionando.

O que eu pretendo é que o meu programa tenha foco apenas em situações determinadas, em que preciso chamar a atenção do usuário. É claro que ele continuará tendo liberdade para usar o computador como quiser. Só quando eu precisar chamar a atenção do usuário, e isso só excepcionalmente, é que preciso que o programa seja focalizado, vindo a primeiro plano. Daí o usuário vê o que é necessário e volta ao que estava fazendo antes.
Inacio de Carvalho Neto
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funções WAPI no Harbour.

Mensagem por asimoes »

Experimenta isso:

Código: Selecionar todos

hwg_SetForegroundWindow(Wvt_GetWindowHandle())
SendMessage(Wvt_GetWindowHandle(),WM_SYSCOMMAND,SC_RESTORE,0)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funções WAPI no Harbour.

Mensagem por asimoes »

Exemplo de foco com thread.

Código: Selecionar todos

hb_threadStart( @Calc() ) //Inicia a thread
Hb_OpenProcess( "C:\Windows\System32\calc.exe" ) //abre a calculadora e fica com o foco
DO WHILE .T.
   @ 10,00 SAY "Estou no programa que chamou calc.exe"
   inkey(0)
ENDDO

FUNCTION Calc
   K:=0
   nTempoUltimaVerificacao:=Seconds()
   nLin:=Row()
   nCol:=Col()
   DO WHILE K=0
      IF Seconds() - nTempoUltimaVerificacao >= 10
         nTempoUltimaVerificacao:=Seconds()
         RestauraTela() //Volta o foco para quem chamou calc.
      ENDIF
      @ 00,00 say Time()
      SetPos(nLin,nCol)
      K:=Inkey()
   ENDDO
   
RETURN .T.

FUNCTION RestauraTela2
   hwg_SetForegroundWindow(Wvt_GetWindowHandle())
   SendMessage(Wvt_GetWindowHandle(),WM_SYSCOMMAND,SC_RESTORE,0)
RETURN Nil
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Funções WAPI no Harbour.

Mensagem por asimoes »

Pode também fechar uma aplicação externa

Código: Selecionar todos

FUNCTION FechaCalc
LOCAL aProcs:={}, nProc:=0
   n:=WIN_GETPROCESSLIST( aProcs, "calc.exe" )
   AEval( aProcs, {|x| nProc++ } )
   IF nProc > 0
      WIN_KILLPROCESS( aProcs[1,2])
   ENDIF
RETURN Nil

#pragma BEGINDUMP
/****************************
*
*
*/
#include "windows.h"
#include <windef.h>
#include <tlhelp32.h>
#include <hbapi.h>
//#include <hbapiitm.h>
  
    /*
    * WIN_GETPROCESSLIST( aArray [, <cProcessToFind> ] ) -> nResult
    * Get current process list on Windows OS. by Vailton Renato <vailtom@gmail.com>
    *
    * Returns:
    *
    *  0 - Success
    *  1 - Argument error
    *  2 - Unable to obtain current process list.
    *  3 - Error retrieving information about processes.
    *
    * 15/12/2009 - 18:58:58
    */
    static
    BOOL GetUserAndDomainFromPID( DWORD ProcessId, PHB_ITEM pUser, PHB_ITEM pDomain )
    {
      HANDLE hToken;
      HANDLE ProcessHandle;
      DWORD cbBuf;
      SID_NAME_USE snu;
      char *User = NULL;
      char *Domain = NULL;
      DWORD UserSize = 0L;
      DWORD DomainSize = 0L;
      BOOL bResult = FALSE;

      ProcessHandle = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, ProcessId );

      if (ProcessHandle)
      {
        if (OpenProcessToken(ProcessHandle, TOKEN_QUERY, &hToken))
        {
          BOOL bSuccess = FALSE;
          PTOKEN_USER ptiUser;
         
          if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &cbBuf ))
          {
             ptiUser  = (TOKEN_USER *) hb_xgrab( cbBuf );
             bSuccess = GetTokenInformation( hToken, TokenUser, (LPVOID) ptiUser, cbBuf, &cbBuf);
          }

          CloseHandle(hToken);

          if (bSuccess)
          {
             LookupAccountSid( NULL, ptiUser->User.Sid, NULL, &UserSize, NULL, &DomainSize, &snu);

             if (UserSize != 0 && DomainSize != 0)
             {
               User   = (char *) hb_xgrab( UserSize );
               Domain = (char *) hb_xgrab( DomainSize );

               if (LookupAccountSid( NULL, ptiUser->User.Sid, User, &UserSize,
                                      Domain, &DomainSize, &snu))
               {
                /* Result OK */
                bResult = TRUE;
               }
             }
           }

          if (ptiUser)
             hb_xfree( ptiUser );
        }
        CloseHandle(ProcessHandle);
      }

      if (!User)
          hb_itemPutC( pUser, "" );
      else
          hb_itemPutCLPtr( pUser, User, UserSize );

      if (!Domain)
          hb_itemPutC( pDomain, "" );
      else
          hb_itemPutCLPtr( pDomain, Domain, DomainSize );

      return bResult;
    }

    HB_FUNC( WIN_GETPROCESSLIST )
    {
      HANDLE hProcessSnap;
      PROCESSENTRY32 pe32;
      PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY );
      const char * szAppName = hb_parcx(2);
      BOOL bCanAdd = TRUE;

       if( !pArray )
       {
          hb_retni( 1 );
          return;
       }

      // Take a snapshot of all processes in the system.
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

      if( hProcessSnap == INVALID_HANDLE_VALUE )
      {
        // CreateToolhelp32Snapshot (of processes)
        hb_retni( 2 );
        return;
      }

      // Set the size of the structure before using it.
      pe32.dwSize = sizeof( PROCESSENTRY32 );

      // Retrieve information about the first process,
      // and exit if unsuccessful
      if( !Process32First( hProcessSnap, &pe32 ) )
      {
        hb_retni( 3 );
        CloseHandle( hProcessSnap );          // clean the snapshot object
        return;
      }

      // Ignores a empty string on seconds argument
      if ( hb_parclen(2) < 1 )
          szAppName = NULL;

      // Now walk the snapshot of processes, and
      // display information about each process in turn
      do
      {
        PHB_ITEM pSubarray;

        if (szAppName)
          bCanAdd = ( hb_stricmp( szAppName, pe32.szExeFile ) == 0 );

        if (bCanAdd)
        {
           pSubarray = hb_itemNew( NULL );

           hb_arrayNew( pSubarray, 5 );
           hb_arraySetC    ( pSubarray, 1, pe32.szExeFile );                    // Process Name
           hb_arraySetNInt ( pSubarray, 2, pe32.th32ProcessID );                // Process ID
           hb_arraySetNInt ( pSubarray, 3, pe32.th32ParentProcessID );          // Parent process ID

           GetUserAndDomainFromPID( pe32.th32ProcessID,
                                    hb_arrayGetItemPtr( pSubarray, 4 ),         // User
                                    hb_arrayGetItemPtr( pSubarray, 5 ) );       // Domain
           hb_arrayAddForward( pArray, pSubarray );
        }
      } while( Process32Next( hProcessSnap, &pe32 ) );

      CloseHandle( hProcessSnap );
      hb_retni( 0 );
      return;
    }

    /*
    * WIN_KILLPROCESS( <nProessIDtoKill> ) -> lKilled
    * Kill a process using Win32 API. by Vailton Renato <vailtom@gmail.com>
    * 16/12/2009 - 00:08:48
    */
    HB_FUNC( WIN_KILLPROCESS )
    {
       DWORD ProcID;
       BOOL Result = FALSE;

       if (HB_ISNUM(1))
       {
          ProcID = (DWORD) hb_parnl(1);
          Result = TerminateProcess(OpenProcess( PROCESS_TERMINATE, FALSE, ProcID ),0);
       }

       hb_retl( Result );
    }
#pragma ENDDUMP       

►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Funções WAPI no Harbour.

Mensagem por rubens »

Olá

Como eu coloco o nome do aplicativo na Focaliza_App ( NomeAplic ) ?
Jânio escreveu:// volta foco para o sistema
NomeAplic = "Sistema"
Focaliza_App( NomeAplic )
O meu aplicativo chama DATASAC.exe, daí tentei DATASAC.exe, DATASAC, datasac mas sempre retorna 0 na função FindWindow(o_exe) ou Sy_FindWindow(o_exe).

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Responder