none
como receber informação com Wm_copydata RRS feed

  • 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 ?

    sexta-feira, 23 de janeiro de 2015 02:17

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

    sábado, 24 de janeiro de 2015 03:57
  • 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 ?
    sexta-feira, 13 de fevereiro de 2015 00:08