Inquiridor
como receber informação com Wm_copydata

Pergunta
-
Pessoal,
Estou construindo uma interface para simplificar os processos realizados por outra aplicação, que possui possibilidade de integração via linha de comando. O processo de chamada é fácil pois são apenas parâmetros passados junto com o nome do app mas o retorno eu não consigo obter.
Segundo o criador, ela retorna via wm_copydata as informações do que ocorreu mas eu não consigo ler.
Atualmente estou tentando assim mas não cai dentro do IF nunca.. Ja coloquei breakpoint ali..
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = WM_COPYDATA Then GetPropValues(m.LParam) End If MyBase.WndProc(m) End Sub
Alguém poderia me ajudar ?
Todas as Respostas
-
Sua aplicação é em WPF?
Para esse tipo de comunicação é necessário usar a api do windows SendMessage e ter o handle do aplicativo que você quer enviar a mensagem WM_COPYDATA. Teria que ver com o criador desse outro sistema e pegar um exemplo com ele de como fazer essa comunicação, ou quais parâmetros você passaria pelo SendMessage.
Dá uma olhada nesse link, uma aplicação em VFP enviando dados para uma em c# e vice-versa.
http://www.news2news.com/vfp/?example=536&ver=vcs
Bruno Ferreira de Souza
MVP - Microsoft Valuable Professional
MCTS .NET Framework - Windows Applications
MCPD .NET Framework - Windows Applications
www.maestrodotnet.com.br
@BrunoMaestro -
Bruno,
minha aplicação é vb.net windows form..
A outra aplicaçao não foi feita por mim, mas me enviaram um trecho de código em delphi que pega o retorno desta aplicação da seguinte maneira :
procedure TfrmGpsFacilMain.WMCopyData(var Msg: TWMCopyData); var data: string; var nP, nT: string; //(integer}; pdata: array[0..99] of Char; //function procedure processaTraducao; //(Data: string): string; const cPrgss = 'Progress '; begin try if Data = 'Transfer started' then begin SetForegroundWindow(Application.Handle); Data := 'Transferência iniciada'; end else if pos('Transfer completed (error)', Data) > 0 then begin SetForegroundWindow(Application.Handle); Data := 'Transferência cancelada!'; end else if pos(cPrgss, Data) > 0 then begin //Data := trim(copy(data, length(cPrgss) + 1, 1 + length(data) - length(cPrgss))); {try if pos('/', Data) > 0 then begin nP := {strtoint+}{(copy(Data, 0, pos('/', Data) - 1)); nT := {strtoint}{(copy(Data, pos('/', Data) + 1, length(data) - pos('/', Data))); if nT = '?' then RzProgressBar1.TotalParts := 0 else RzProgressBar1.TotalParts := strtoint(nT); RzProgressBar1.PartsComplete := strtoint(nP); end; except end; Data := '';} end else if Data = 'Transfer completed' then begin SetForegroundWindow(Application.Handle); Data := 'Transferência concluída'; end; RzProgressBar1.Caption := Data; //result := Data; //'if Data <> '' then //' Memo1.Lines.Add(Data); except end; Application.ProcessMessages; end; begin // get request //data := string(ShortString(Msg.CopyDataStruct^.lpData^)); StrLCopy(pdata, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); data := string(pData); if pos(#0, data) > 0 then data := copy(data, 0, pos(#0, data)); // processing //Data := ProcessaTraducao; //(Data); //'SendToServer('CallingApp', 'Ready to continue'); end;
será que alguém consegue me ajudar ?