Finalizando Aplicativo Windows
Enviado: 06 Fev 2013 18:01
Tem razão Mario, nessa versão que tinha na seção de Downloads, não estava atualizada. Faça o download novamente.
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 aDataAppInfoAqui 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
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 ?
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
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?
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.
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
Error BASE/1132 Bound error: array access
Called from DEBUGMSG(94)
Called from MAIN(14)
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)