Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
ric_rio2 Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018 Mensagens: 108
|
Enviada: Sex Abr 12, 2019 2:52 pm Assunto: Abrir calculadora dentro do Panel |
|
|
Bom dia..
Fiz um projeto em que abro a calculadora dentro de um form..
Funciona tudo ok.. ate consigo posiciona-la no top e left do panel que eu quero.
Contudo ... sempre tem um contudo só funciona em windows 7..
Quando Rodo a aplicação em WIN10... a aplicação abre a calculadora mas
NÃO coloca dentro do panel..
Algum dos senhores sabe o motivo para tal comportamento?
Sei que é por causa do sistema operacional
Alguma ideia de como devo proceder para funcionar corretamente no WIN10???
 |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Sex Abr 12, 2019 8:54 pm Assunto: |
|
|
Poste o codigo de como estar a colocar a calculadora no panel.
Dependendo se tenha usado funções do tipo findwondow é provavel que seja pela classe da janela calculadora que deve ser diferente em ambos sistema win7 e win10 onde sabemos que o findwindow(classe da janela, titulo da janela).
voce resolve a questão executando a calculadora e pegando seu pid e trabalhando diretamente com ele.
para isso trablhar com conversão de pid para handle será nescessario. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
ric_rio2 Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018 Mensagens: 108
|
Enviada: Ter Abr 16, 2019 10:28 am Assunto: |
|
|
Bom dia strak2012
Cara.. Entendi o que tu falou..
Estava fazendo os acertos aqui para testar..mas me pediram para dar atenção a outra parada..
Assim que testar posto como ficou..
Já Pego o pID ... tanto para win7 e para win10
Já chamo o programa (calculadora)
Ao Fechar o FORM já MATO o processo pID.
Agora falta testar o shellexecute chamando uma aplicação delphi com parametros..
comecei assim ..:
Lista:= ' 0 GIF 12 12';
ShellExecute(0, 'open' , PWideChar(ED_Caminho_AguardeVCL.Text), PwideChar(Lista), nil, 0);
Como falei.. Assim que terminar a demanda aqui, acabo de testar essa parada da CALCULADORA e posto aqui completo
Obrigado pela atenção  |
|
Voltar ao Topo |
|
 |
ric_rio2 Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018 Mensagens: 108
|
Enviada: Ter Abr 16, 2019 2:41 pm Assunto: |
|
|
Boa tarde a todos..
Segue abaixo o codigo quase perfeito..
Ainda não consigo colocar o programa CHAMADO dentro do panel1.
Função que acha e retorna o Pid..:
Código: | Function TFo_Main.Acha_Processo(pPrograma : String) : Integer;
var
A :Integer;
SnapProcHandle: THandle;
NextProc : Boolean;
ProcessEntry : TProcessEntry32;
begin
Result:= 0;
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessEntry.dwSize := sizeof(ProcessEntry);
NextProc := Process32First(SnapProcHandle, ProcessEntry);
while NextProc do
begin
if pPrograma = ProcessEntry.szExeFile then
begin
Result:= ProcessEntry.th32ProcessID;
A:= SnapProcHandle;
end;
NextProc := Process32Next(SnapProcHandle, ProcessEntry);
end;
CloseHandle(SnapProcHandle);
end; |
{-------}
Clicke de um botao
Código: | Click_Botao
Lista : String;
A : Integer;
hwnd : THandle;
Parms : Array[0..1024] of Char;
begin
Lista:= '';
Lista:= Lista + ' ' +Rg_Tipo.Items.Strings[Rg_Tipo.ItemIndex];
If Label5.Caption <> '' then
Lista:= Lista + ' ' + Label5.Caption
Else
Lista:= Lista + ' 0' ;
Lista:= Lista +' '+ IntToStr(StrToIntDef(Me_Left.Text,0));
Lista:= Lista +' '+ IntToStr(StrToIntDef(Me_Top.Text,0));
If Cb_Transparente.Checked = False then
Lista:= Lista + ' 0'
Else
If Cb_Transparente.Checked then
Lista:= Lista + ' 1';
StrPCopy(Parms,Lista);
ShellExecute(0, 'open' , PWideChar(ED_Caminho_AguardeVCL.Text), Parms, nil, 0);
hwnd:= Acha_Processo(ExtractFileName('ED_Caminho_AguardeVCL.Text'));
Windows.SetParent( hwnd,panel1.handle ); |
Estou empacado na ultima linha
Windows.SetParent( hwnd,panel1.handle )
Gostaria de pegar o programa aberto e colocar Dentro do panel1.
Com o código que tinha... funionava no win7...
Este codigo que posto agora.. funciona para o win7 e win10 ..
mas NÃO coloca o .exe chamado no panel..
Algum dos senhores teria uma ideia do porque??  |
|
Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Ter Abr 16, 2019 9:01 pm Assunto: |
|
|
Provavelmente o erro está nessa linha:
Código: | hwnd:= Acha_Processo(ExtractFileName('ED_Caminho_AguardeVCL.Text')); |
Você está passando o parâmetro como String. Tente:
Código: | hwnd:= Acha_Processo(ExtractFileName(ED_Caminho_AguardeVCL.Text)); |
_________________ "Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!" |
|
Voltar ao Topo |
|
 |
marcieldeg Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Ter Abr 16, 2019 9:15 pm Assunto: |
|
|
De qualquer forma, tem muitos pontos falhos nesse código.
Acha_Processo() retorna o Handle do processo, e não da janela. São coisas totalmente diferentes. Você fez metade do caminho rs...
Abrir o processo com ShellExecute e depois buscar todos os processos abertos também pode ser uma fria... se o processo já estiver aberto em background ele vai ser capturado de forma errada. Use CreateProcess() que retorna o PID e o Handle do processo que você criou, sem erros.
Você pode iniciar uma aplicação mas, no momento que tentar recuperar sua janela, a mesma ainda não foi criada. Antes de usar SetParent(), você precisa testar se a janela já está visível com o método IsWindowVisible().
Enfim, nesse tópico tem umas dicas legais: http://www.activedelphi.com.br/forum/viewtopic.php?t=75148&sid=83c0074c966c3bc3679f988097fc06be _________________ "Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!" |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Abr 16, 2019 9:50 pm Assunto: |
|
|
o codigo é mais ou menos este aqui:
Código: | function Exec(const FileName, Params: string;
const WindowState: Word): THandle;
var
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
result:=-1;
CmdLine := '"' + FileName + '"' + #32 + Params;
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;
if CreateProcess(nil, PChar(CmdLine), nil, nil, False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(FileName)), SUInfo, ProcInfo) then
result:=ProcInfo.hProcess;
// hProcess: THandle; handle da aplicação
// hThread: THandle; handle da thread principal da aplicação
// dwProcessId: DWORD; pid (id da aplicação) da aplicação
// dwThreadId: DWORD; tid (id da thread) da aplicação
end; |
Modo de uso:
Código: | hwnd:= Exec(local e nomde da aplicação, parametros a passar para aplicação,ws_normal);
if hwnd<>-1 then
Windows.SetParent( hwnd,panel1.handle ); |
_________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
ric_rio2 Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018 Mensagens: 108
|
Enviada: Seg Abr 22, 2019 4:15 pm Assunto: |
|
|
Boa Tarde marcieldeg e strak2012
Muito obrigado pela atenção
Vamos la..
marcieldeg O que postei em
"hwnd:= Acha_Processo(ExtractFileName('ED_Caminho_AguardeVCL.Text'));"
Era só erro de digitação aqui.. o código estava sem o plick simples..
Grande observação mesmo assim
Como o Strak2012 demonstrou sabiamente no exemplo com as opções
// hProcess: THandle; handle da aplicação
// hThread: THandle; handle da thread principal da aplicação
// dwProcessId: DWORD; pid (id da aplicação) da aplicação
// dwThreadId: DWORD; tid (id da thread) da aplicação
Eu já tinha tentado retorna o Handle do processo, a janela, o pid.... Retornar eu ate retorno.. mas não funciona o
Windows.SetParent( hwnd,panel1.handle )
Mesmo no seu exemplo Strak2012 não COLA o programa CHAMADO no programa CHAMADOR...
Como fiz funcionar..
var
text : RawByteString;
begin
Text:= ED_Caminho_AguardeVCL.text;
WinExec(pansiChar(text),SW_NORMAL);// se Colocar direto pAnsiChar( ED_Caminho_AguardeVCL.text) NÃO FUNCIONA
Windows.SetParent( FindWindow( nil, 'NOME_X' ),panel1.handle ) ;
Onde NOME_X é ..:
No Windows 7 no gerenciador de tarefas -> Aplicativos o NOME QUE APARECE NELE do aplicativo CHAMADO
No Windows 10 - > Gerenciador de Tarefas -> Processos -> Aplicativos -> Seleciona o aplicativo e coloca a seta para baixo -> o Nome que aparecer
bom..
Funcionou..
Espero que sirva para alguem essa informação
Abraço a todos  |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Abr 22, 2019 5:21 pm Assunto: |
|
|
WinExec(pansiChar(text),SW_NORMAL);// se Colocar direto pAnsiChar( ED_Caminho_AguardeVCL.text) NÃO FUNCIONA
para funcionar precisar fazer mais um cast para ansistring tipo:
WinExec(pansiChar(ansistring(ED_Caminho_AguardeVCL.text)),SW_NORMAL);// assim ja funciona
Mas isso é variante de acordo com a versão do delphi
em delphi 6 esta linha seria:
WinExec(pchar(ED_Caminho_AguardeVCL.text),SW_NORMAL);
nas versões de delphi com suporte a unidecode ficou:
WinExec(pansiChar(ansistring(ED_Caminho_AguardeVCL.text)),SW_NORMAL); _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
ric_rio2 Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018 Mensagens: 108
|
Enviada: Qua Abr 24, 2019 7:23 am Assunto: |
|
|
Bom dia strak2012.. tudo certinho??
De fato então o problema era esse desde o começo.. a versão do delphi...
No Delphi 7 Funciona de boa o Winexec(pChar(variavelstring),sw_normal)
Enquanto no Delphi CE não.. e também não tinha feito a conversão como tu demonstrou agora.. e que funciona PERFEITAMENTE
Valeu mesmo pela atenção..
Abraços  |
|
Voltar ao Topo |
|
 |
|