Funções com API do Windows
Moderador: Moderadores
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Finalizando Aplicativo Windows
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.
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Finalizando Aplicativo Windows
ok Pablo vi varias formas de usar como :
E esta é a função getappinfodata
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
Código: Selecionar todos
aData:=GetAppInfoData(Chr(91)+cProject+Chr(93),2)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 aDataAppInfoGetAppInfoData(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.
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.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Funções com API do Windows
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.Mário Isa escreveu:ok Pablo vi varias formas de usar como :Código: Selecionar todos
aData:=GetAppInfoData(Chr(91)+cProject+Chr(93),2)
Esta função compõe a matriz contendo hWnd_OWNER, cTitle_OWNER, hWnd,E esta é a função getappinfodataCó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
cTitle_Win, nThreadId, nProcessId, cProcessPath e cProcessName
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: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 ?
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 32O 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.Mário Isa escreveu:vc tem o hmb_unicode.h ai pra me arrumar ?
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 384 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.
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Funções com API do Windows
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
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Funções com API do Windows
talvez aqui neste pedaço
eu possa tirar o atributo .AND. IsWindowVisible( hWnd ) e assim ele pegaria até as janelas invisíveis ?
:%
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
:%
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Funções com API do Windows
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.
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Funções com API do Windows
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
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
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Funções com API do Windows
Fez bem baxar esta versão, pois é a que antecede à versão com UNICODE.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
Correto, em HMG não usa ".LIB" sim ".a"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
Toda função é possivel compilar ao menos em Harbour. Quanto a xHarbour, não sei.Mas pelo q já pude ver o xhb nao vai compilar.
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:mas nao reconhece as funções GETFOREGROUNDWINDOW, GETWINDOW e GETWINDOWTEXT.
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 );
}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.Então seguem perguntas:
a) Este programa só pode seer compilado com a HMG ?
b) tem como compilar em xhb?
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.
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.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Funções com API do Windows
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.
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Funções com API do Windows
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.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.
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.
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Funções com API do Windows
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
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
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Funções com API do Windows
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:
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.
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
Funções com API do Windows
Pablo por favor troque:
por
Obrigado.
Mário
Código: Selecionar todos
Fll += aTemp, hb_PValue(i)+chr(13)+chr(10)Código: Selecionar todos
Fll += hb_PValue(i)+chr(13)+chr(10)
Mário
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Funções com API do Windows
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
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.
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.