Funções com API do Windows

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

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Finalizando Aplicativo Windows

Mensagem por Pablo César »

Tem razão Mario, nessa versão que tinha na seção de Downloads, não estava atualizada. Faça o download novamente.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Finalizando Aplicativo Windows

Mensagem por Mário Isa »

ok Pablo vi varias formas de usar como :

Código: Selecionar todos

aData:=GetAppInfoData(Chr(91)+cProject+Chr(93),2)
E esta é a função getappinfodata

Código: Selecionar todos

Function GetAppInfoData (cFind_Text, nFind)
Local aDataAppInfo, i, k:=1

aRawData := GetAppInfo (cFind_Text, nFind)
aDataAppInfo := ARRAY ((LEN(aRawData)/8), 8)
FOR i = 1 TO LEN (aDataAppInfo)
    aDataAppInfo [i,1] := aRawData [k]; k++   // hWnd_OWNER
    aDataAppInfo [i,2] := aRawData [k]; k++   // cTitle_OWNER
    aDataAppInfo [i,3] := aRawData [k]; k++   // hWnd
    aDataAppInfo [i,4] := aRawData [k]; k++   // cTitle_Win
    aDataAppInfo [i,5] := aRawData [k]; k++   // nThreadId
    aDataAppInfo [i,6] := aRawData [k]; k++   // nProcessId
    aDataAppInfo [i,7] := aRawData [k]; k++   // cProcessPath
    aDataAppInfo [i,8] := aRawData [k]; k++   // cProcessName
NEXT
Return aDataAppInfo
Como devo invocar a função ?
GetAppInfoData(parametros)
ou Getappinfo(parametros)
ou Func_Getappinfo(parametros)

para obter o array com os nomes dos programas rodando ?
Mário
Editado pela última vez por Pablo César em 07 Fev 2013 10:54, em um total de 1 vez.
Razão: Atenção Mario com respeito a duplicidade de mensagens. A mesma mensagem tinha sido postada duas vezes. Lembrando que o próprio usuário pode remover a ultima msg.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Finalizando Aplicativo Windows

Mensagem por Mário Isa »

vc tem o hmb_unicode.h ai pra me arrumar ?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Funções com API do Windows

Mensagem por Pablo César »

Mário Isa escreveu:ok Pablo vi varias formas de usar como :

Código: Selecionar todos

aData:=GetAppInfoData(Chr(91)+cProject+Chr(93),2)
Aqui utilizo o título da janela. Os Chrs são para adicionar colchetes que na IDE possui e que fazem parte do título da janela. Lembre que o aplicativo serve para mudar o título da janela da IDE onde o projeto se encontra. Muitas vezes podem haver várias janelas de IDEs com projetos diferentes e neste caso só precisava pegar o projeto em questão.
E esta é a função getappinfodata

Código: Selecionar todos

Function GetAppInfoData (cFind_Text, nFind)
Local aDataAppInfo, i, k:=1

aRawData := GetAppInfo (cFind_Text, nFind)
aDataAppInfo := ARRAY ((LEN(aRawData)/8), 8)
FOR i = 1 TO LEN (aDataAppInfo)
    aDataAppInfo [i,1] := aRawData [k]; k++   // hWnd_OWNER
    aDataAppInfo [i,2] := aRawData [k]; k++   // cTitle_OWNER
    aDataAppInfo [i,3] := aRawData [k]; k++   // hWnd
    aDataAppInfo [i,4] := aRawData [k]; k++   // cTitle_Win
    aDataAppInfo [i,5] := aRawData [k]; k++   // nThreadId
    aDataAppInfo [i,6] := aRawData [k]; k++   // nProcessId
    aDataAppInfo [i,7] := aRawData [k]; k++   // cProcessPath
    aDataAppInfo [i,8] := aRawData [k]; k++   // cProcessName
NEXT
Return aDataAppInfo
Esta função compõe a matriz contendo hWnd_OWNER, cTitle_OWNER, hWnd,
cTitle_Win, nThreadId, nProcessId, cProcessPath e cProcessName
Como devo invocar a função ?
GetAppInfoData(parametros)
ou Getappinfo(parametros)
ou Func_Getappinfo(parametros)

para obter o array com os nomes dos programas rodando ?
Tudo depende do que você procura. No exemplo procuro apenas o título da janela. Mas este é diferenciado, se o que você procura é a janela pai ou child. Note que passando o nFind (no meu caso serviu o número 2) em GetAppInfoData (cFind_Text, nFind). Eu utilizei o número 2 mas pode ser usados:

Código: Selecionar todos

#define FIND_INFO_cTitle_OWNER           1
#define FIND_INFO_cTitle_Win             2
#define FIND_INFO_cProcessName           4
#define FIND_INFO_cProcessPath           8
#define FIND_INFO_CaseSensitive          16
#define FIND_INFO_Only_hWnd_OWNER_Zero   32
Mário Isa escreveu:vc tem o hmb_unicode.h ai pra me arrumar ?
O arquivo HMG_UNICODE.h que você se refere, é para compilar com HMG que agora nas suas ultimas versões trabalha com padrão UNICODE. Então para você adaptar terá que substituir as funções em C que começam com HMG_ por hb_ e remover a função _TEXT que servem para retorno em modo UNICODE.

Eu indiquei esta função em C, porque achei mais completa e bem mais abrangente. Porque o que eu procurava, era inclusive em janela do tipo child. Mas agora pensando bem, você vai ter algum trabalho para converter em xHb. Então estou anexando o pacote que é algo mais simples para você adaptar ai. Claro que está em HMG/Harbour.
Anexos
GetWinTit.rar
(752.24 KiB) Baixado 383 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Funções com API do Windows

Mensagem por Mário Isa »

Muito bom Pablo!

Mas ele conseguiu os nomes apenas das janelas abertas.
E eu precisaria de todos os processos rodando.
Mesmo os que não tem janela como o acbrnfemonitor ou qq outro que rode em background.
Ou seja, eu gostaria de fazer o mesmo q faz o qprocess.exe (processo do windows)
pois ele pega todos os processos independete de eles terem janela.
Vc conhece alguma coisa ?

Mário
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Funções com API do Windows

Mensagem por Mário Isa »

talvez aqui neste pedaço

Código: Selecionar todos

   If GetWindow( hWnd, GW_OWNER ) = 0 .AND.;  // If it is an owner window
			IsWindowVisible( hWnd ) .AND.;     // If it is a visible window
			hWnd != hOwnWnd .AND.;             // If it is not this app
			!EMPTY( cTitle ) .AND.;            // If the window has a title
			!( "Prompt de comando" $ cTitle ) .AND.; // If it is not DOS session
			!( cTitle == "Program Manager" )   // If it is not the Program Manager
eu possa tirar o atributo .AND. IsWindowVisible( hWnd ) e assim ele pegaria até as janelas invisíveis ?
:%
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Funções com API do Windows

Mensagem por Pablo César »

Isso mesmo !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Funções com API do Windows

Mensagem por Mário Isa »

bom... tentei compilar com xhb mas não deu.
tambem não tava achando o hmg.ch
daí baixei e instalei o hmg versão 3.0.46
daí achei o hmg.ch
mas nao reconhece as funções GETFOREGROUNDWINDOW, GETWINDOW e GETWINDOWTEXT.
Pesquisei entre as .LIB's do hmb (que não são .LIB e sim .A)
e localizei a função dentro da libhmg.a nos pacotes da hmb 3.0.46
Mas pelo q já pude ver o xhb nao vai compilar.

Então seguem perguntas:
a) Este programa só pode seer compilado com a HMG ?
b) tem como compilar em xhb?

Mário
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Funções com API do Windows

Mensagem por Pablo César »

Mário Isa escreveu:bom... tentei compilar com xhb mas não deu.
tambem não tava achando o hmg.ch
daí baixei e instalei o hmg versão 3.0.46
Fez bem baxar esta versão, pois é a que antecede à versão com UNICODE.
Pesquisei entre as .LIB's do hmb (que não são .LIB e sim .A)
e localizei a função dentro da libhmg.a nos pacotes da hmb 3.0.46
Correto, em HMG não usa ".LIB" sim ".a"
Mas pelo q já pude ver o xhb nao vai compilar.
Toda função é possivel compilar ao menos em Harbour. Quanto a xHarbour, não sei.
mas nao reconhece as funções GETFOREGROUNDWINDOW, GETWINDOW e GETWINDOWTEXT.
Essas funções estão em código C. Portanto pode utilizar. Você não deve ter procurado direito, mas encontram-se em C:\hmg.3.0.46\SOURCE\c_windows.c, pois a HMG é totalmente OPENSOURCE, todos os fontes estão no pacote e aqui estão para você incorporá-las e adaptá-las no caso em xHarbour:

Código: Selecionar todos

HB_FUNC (GETFOREGROUNDWINDOW)
{
	HWND x;

	x = GetForegroundWindow() ;
	hb_retnl ((LONG) x );
}
HB_FUNC (GETWINDOW)
{
   hb_retnl( ( LONG ) GetWindow( ( HWND ) hb_parnl( 1 ), hb_parni( 2 ) ) );
}
HB_FUNC ( GETWINDOWTEXT )
{
   USHORT iLen = 65000;
   TCHAR *cText = (TCHAR*) hb_xgrab( iLen+1 * sizeof(TCHAR));

	GetWindowText(
	(HWND) hb_parnl (1),	
	(LPTSTR) cText,       	
	iLen                   	
	);	

   HMG_retc( cText );
   hb_xfree( cText );
}
Então seguem perguntas:
a) Este programa só pode seer compilado com a HMG ?
b) tem como compilar em xhb?
Como eu disse, sendo código em C, já tem um começo. Portanto podem ser compilada em Harbour, ao menos isso tenho certeza ab. Quanto a xHarbour, como eu não trabalho com xhb, não sei te responder.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Funções com API do Windows

Mensagem por rochinha »

Amiguinhos,

Voltando ao inicio, vale lembrar que para o uso do WMI é necessário que o serviço esteja ativo na máquina em que se deseja usar pesquisas de comportamento.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Funções com API do Windows

Mensagem por Pablo César »

rochinha escreveu:vale lembrar que para o uso do WMI é necessário que o serviço esteja ativo na máquina em que se deseja usar pesquisas de comportamento.
Ahhh você refere-se a função StatusExe(cExecutavel,oque) do TerraSoftware ? Ahh já foi dito que além de funcionar Windows 98 (que não são baseados em NT) e ainda tomando em conta esse detalhe que o serviço deva estar ativo. Mas as funções que passei não utilizam WMI service, o colega está procurando uma rotina em C que liste todos os processos em execução.

Mario: Você já experimentou adaptar e compilar o código do Vailton ? Que está neste mesmo tópico em: https://pctoledo.org/forum/viewto ... 424#p57424 verifique se está mais fácil e dê um retorno de como você fez. ok ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Funções com API do Windows

Mensagem por Mário Isa »

Pablo fiz uma modificação no programa GetWintitles q vc fez.
Vc podeeira compilar aí prá mim e me devolver o executável. ?
Obrigado
Segue o programa

Código: Selecionar todos

#include <hmg.ch>

#define GW_HWNDFIRST	0
#define GW_HWNDNEXT		2
#define GW_OWNER		4

Function Main()
//################# inserido por mim - a variável como é recebida como um parametro
Parameters como
//################# inserido por mim


Local aTitles := GetTitles( GetForegroundWindow() )

DebugMSG(aTitles)
Return

Function GetTitles( hOwnWnd )
Local aTasks := {}, cTitle := "", ;
	hWnd := GetWindow( hOwnWnd, GW_HWNDFIRST )        // Get the first window


//################# inserido por mim
mytexto := estacao := estacnu := unitserver := ''

mydir := directory('solicaux.t??')
cntarq := 1
while cntarq <= len(mydir)
 mytexto += mydir[cntarq,1]+crlf+memoread(mydir[cntarq,1])+crlf+crlf
 if getenv('USERDOMAIN')+'###'+getenv('USERNAME') $ memoread(mydir[cntarq,1])
  estacao := 'TERM'+ltri(str(val(subs(mydir[cntarq,1],11))))
  estacnu := subs(mydir[cntarq,1],11)
  unitserver := if ('UNITSERVER' $ memoread(mydir[cntarq,1]) , estacao , '' )
  exit
 end

 cntarq++
end
//################# inserido por mim


//################# inserido por mim - como = 'V' significa só as visíveis
if como = 'v'
//################# inserido por mim

Do While hWnd != 0                                   // Loop through all the windows
   cTitle := GetWindowText( hWnd )
   If GetWindow( hWnd, GW_OWNER ) = 0 .AND.;  // If it is an owner window
			IsWindowVisible( hWnd ) .AND.;     // If it is a visible window
			hWnd != hOwnWnd .AND.;             // If it is not this app
			!EMPTY( cTitle ) .AND.;            // If the window has a title
			!( "Prompt de comando" $ cTitle ) .AND.; // If it is not DOS session
			!( cTitle == "Program Manager" )   // If it is not the Program Manager
      aAdd( aTasks, { cTitle, hWnd } )
   Endif
   hWnd := GetWindow( hWnd, GW_HWNDNEXT )     // Get the next window
Enddo

//################# inserido por mim - como = 'i' significa só as invisíveis
elseif como = 'i'
//################# inserido por mim

Do While hWnd != 0                                   // Loop through all the windows
   cTitle := GetWindowText( hWnd )
   If GetWindow( hWnd, GW_OWNER ) = 0 .AND.;  // If it is an owner window
			hWnd != hOwnWnd .AND.;             // If it is not this app
			!EMPTY( cTitle ) .AND.;            // If the window has a title
			!( "Prompt de comando" $ cTitle ) .AND.; // If it is not DOS session
			!( cTitle == "Program Manager" )   // If it is not the Program Manager
      aAdd( aTasks, { cTitle, hWnd } )
   Endif
   hWnd := GetWindow( hWnd, GW_HWNDNEXT )     // Get the next window
Enddo


//################# inserido por mim
end
//################# inserido por mim

Return ( aTasks )

Function DebugMSG
Local i, aTemp := {}

//################# inserido por mim - definindo uma variável texto vazia
Local fll := ''   
//################# inserido por mim

For i := 1 to pcount()

//################# comentado por mim
    //aadd( aTemp, hb_PValue(i))
//################# comentado por mim

//################# inserido por mim -> adicionando na var texto o conteudo seguido de carriage return
    Fll += aTemp, hb_PValue(i)+chr(13)+chr(10)
//################# inserido por mim

Next i

//################# comentado por mim
//MsgBox(hb_valtoexp(aTemp), "Helpful informations")
//################# comentado por mim


//################# inserido por mim --> gravando em um texto o conteudo da variavel
memowrit('qp.t'+estacnu,fll)
//################# inserido por mim
Return Nil
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Funções com API do Windows

Mensagem por Pablo César »

Oi Mario, o seu código está dando erro na linha 92: main.prg(92) Error E0030 Syntax error "syntax error at ','" onde está:

Fll += aTemp, hb_PValue(i)+chr(13)+chr(10)

Tentei refazerassim: Fll += aTemp+hb_PValue(i)+chr(13)+chr(10) mas deu erro este na execução:
Error BASE/1132 Bound error: array access


Called from DEBUGMSG(94)
Called from MAIN(14)
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Funções com API do Windows

Mensagem por Mário Isa »

Pablo por favor troque:

Código: Selecionar todos

Fll += aTemp, hb_PValue(i)+chr(13)+chr(10)
por

Código: Selecionar todos

    Fll += hb_PValue(i)+chr(13)+chr(10)
Obrigado.
Mário
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Funções com API do Windows

Mensagem por Pablo César »

Ainda dá erro na mesma linha. O HB_PVALUE() no laço de repetição, ora devolve valor numérico ora do tipo caracter. Adicionei o hb_valtoexp() para que pudesse concatenar, ficando: Fll += hb_valtoexp(hb_PValue(i))+chr(13)+chr(10) mas mesmo assim dá outro erro na linha 105 ( memowrit('qp.t'+estacnu,fll) ) Error BASE/1003 Variable does not exist: ESTACNU. Adicionei Private estacnu:="" no Main e funcionou, testando com parâmetros "v" e "i".

O código e o executável seguem em anexo junto com os arquivos para carregar na IDE (.hbp)

Você não pode instalar o HMG no seu PC ?

Obs.: Anexo removido. Versão mais recente em: https://pctoledo.org/forum/viewto ... 124#p81124
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder