Página 2 de 3
Funções WAPI no Harbour.
Enviado: 26 Set 2014 21:43
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?
Funções WAPI no Harbour.
Enviado: 26 Set 2014 22:45
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
Funções WAPI no Harbour.
Enviado: 27 Set 2014 00:21
por cjp
Certeza se é esta a correta eu não tenho; mas achei que seria.
Estou chamando simplesmente assim:
Funções WAPI no Harbour.
Enviado: 27 Set 2014 07:16
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.
Funções WAPI no Harbour.
Enviado: 27 Set 2014 10:10
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.
Funções WAPI no Harbour.
Enviado: 27 Set 2014 10:28
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,
Funções WAPI no Harbour.
Enviado: 27 Set 2014 11:14
por cjp
Ah, então é isso: eu não uso Minigui.
Funções WAPI no Harbour.
Enviado: 27 Set 2014 16:50
por Jairo Maia
Olá Inácio,
Mas acho que você pode substituir a ShellExecute() pela Hb_OpenProcess( cPath + executavel.exe )
Funções WAPI no Harbour.
Enviado: 27 Set 2014 17:44
por cjp
Sim, a Hb_openprocess() funcionou para abrir o outro programa.
Mas o foco ainda não está voltando ao programa.
Funções WAPI no Harbour.
Enviado: 27 Set 2014 17:56
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...
Funções WAPI no Harbour.
Enviado: 27 Set 2014 18:12
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.
Funções WAPI no Harbour.
Enviado: 29 Set 2014 08:59
por asimoes
Experimenta isso:
Código: Selecionar todos
hwg_SetForegroundWindow(Wvt_GetWindowHandle())
SendMessage(Wvt_GetWindowHandle(),WM_SYSCOMMAND,SC_RESTORE,0)
Funções WAPI no Harbour.
Enviado: 29 Set 2014 09:12
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
Funções WAPI no Harbour.
Enviado: 29 Set 2014 10:53
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
Funções WAPI no Harbour.
Enviado: 27 Set 2015 11:12
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