Получение идентификатора ошибки: 0 из метода Windows: FindWindow - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь отправить сообщение Windows в мое приложение Delphi, но у меня возникают проблемы с методом FindWindow: я получаю идентификатор ошибки 0 из метода GetLastError.Я использую Vista, и из того, что я читал, эта ошибка часто встречается в XP или более ранних версиях, но должна нормально работать в Vista или Win 7 (может быть, я неправильно понял?).

Это код, который я использую, и он находится в DLL-файле Delphi, написанном на Delphi 5:

procedure SendData(const copyDataStruct: TCopyDataStruct) ;
var
   receiverHandle : THandle;
   res : integer;
begin
   receiverHandle := FindWindow(PChar('TMainForm'),PChar('MainForm')) ;
   if receiverHandle = 0 then
   begin
   ShowMessage(format('Error %x finding MainForm',
    [GetLastError()]));
     Exit;
   end;

   res := SendMessage(receiverHandle, WM_COPYDATA, Integer(receiverHandle), Integer(@copyDataStruct)) ;
end;

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Согласно списку системных ошибок , ошибка 0 означает « ERROR_SUCCESS ».

Возможно, ваше окно имеет класс TMainWindow, ноимеет пустой заголовок?

См. примечания для GetWindowText , который внутренне используется FindWindow , когда параметр lpWindowName не равен нулю (что является случаем: вы передаетеMainWindow там).

- Йероен

0 голосов
/ 07 октября 2010

Трансляция пользовательского сообщения всем окнам. Только ваше окно будет знать, как на это реагировать. Затем он может ответить своим текущим HWND в другом сообщении, чтобы вещателю не приходилось искать его вручную. Используйте RegisterWindowMessage () для регистрации уникальных идентификаторов сообщений, которые другие приложения будут игнорировать. Например:

Приложение 1:

var
  WM_WHERE_ARE_YOU: UINT = 0;
  WM_HERE_I_AM: UINT = 0;
  App2Wnd: HWND = 0;

procedure TApp1Form.FromCreate(Sender: TObject);
begin
  // use whatever string names you want, as long as they match App 2...
  WM_WHERE_ARE_YOU := RegisterWindowMessage("WhereAreYou");
  WM_HERE_I_AM := RegisterWindowMessage("HereIAm");
end;

procedure TApp1Form.WndProc(var Message: TMessage);
begin
  if (Message.Msg = WM_HERE_I_AM) and (WM_HERE_I_AM <> 0) then
    App2Wnd := HWND(Message.LParam)
  else
    inherited;
end;

procedure TApp1Form.SendData(const copyDataStruct: TCopyDataStruct);
var 
  res : integer; 

  procedure FindApp2Window;
  var
    Ignore: DWORD;
  begin
    App2Wnd := 0;
    if WM_WHERE_ARE_YOU = 0 then Exit;
    SendMessageTimeout(HWND_BROADCAST, WM_WHERE_ARE_YOU, 0, Longint(Self.Handle), SMTO_NORMAL, 500, Ignore);
    if App2Wnd = 0 then Application.ProcessMessages;
  end;

begin 
   FindApp2Window; 
   if App2Wnd = 0 then 
   begin 
     ShowMessage(Format('Unable to find MainForm');
     Exit; 
   end; 
   res := SendMessage(App2Wnd, WM_COPYDATA, Longint(Self.Handle), Longint(@copyDataStruct));
   ...
end;

Приложение 2:

var
  WM_WHERE_ARE_YOU: UINT = 0;
  WM_HERE_I_AM: UINT = 0;

procedure TApp2Form.FromCreate(Sender: TObject);
begin
  // use whatever string names you want, as long as they match App 1...
  WM_WHERE_ARE_YOU := RegisterWindowMessage("WhereAreYou");
  WM_HERE_I_AM := RegisterWindowMessage("HereIAm");
end;

procedure TApp2Form.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_COPYDATA:
    begin
      if PCopyDataStruct(Message.LParam)^.dwData = ... then
      begin
        ...
        Message.Result := 1;
        Exit;
      end;
    end;
    ...
  else
    if (Message.Msg = WM_WHERE_ARE_YOU) and (WM_WHERE_ARE_YOU <> 0) then
    begin
      if WM_HERE_I_AM <> 0 then
        PostMessage(HWND(Message.LParam), WM_HERE_I_AM, 0, Longint(Self.Handle));
      Exit;
    end;
  end;

  inherited;
end;
...