Obsługa przycisku stworzonego w innym procesie/aplikacja

0

Cześć
Potrzebuję obsłużyć przycisk, który tworzę dynamicznie w oknie innego programu. Kombinuje, kombinuje i nie mogę tego rozgryźć. Mam:

button := TButton.CreateParented(wnd2);
       button.Caption:='START';
       button.Visible:=False;
       button.Show;
       button.OnClick:=Button2Click;

Przycisk się ładnie tworzy, lecz po wciśnięciu nic się nie dzieje

0

W oknie innego programu czy w innym oknie tego samego programu?

0

W oknie innego programu

0

Bawisz się Cheat Enginem i robisz trainery więc z dll injection nie powinieneś mieć dużych problemów.

0

Może po prostu wyszukaj uchwyt do tego przycisku i go kliknij?

1

@robertz68: to nie w tę stronę – nie chodzi o kliknięcie przycisku bo to banał, a o wykonanie własnego kodu po jego wciśnięciu. IMO bez WinAPI i podłączenia się pod pętlę komunikatów okna się nie obejdzie.

0

Opiszę dokładniej.
Moja aplikacja "czyta" wartości z programu do obsługi maszyny (za pomocą uchwytów), przelicza coś i wyświetla z powrotem w programie do maszyny, chodzi dokładnie o statystyki. Teraz potrzebuję dodać przycisk do programu z maszyny, który będzie resetował statystyki. Kod z pierwszego posta ładnie dodaje przycisk do programu z maszyny, tylko nie wiem jak go obsłużyć, wywołać procedurę w mojej aplikacji po kliknięciu tego przycisku w programie z maszyny

0

A tak z ciekawości, w jaki sposób uzyskujesz uchwyt do okna tego programu obsługi maszyny?

0

@olesio pewnie wie jak coś takiego zrobić – dawno go tutaj nie było to może wpadnie na chwilę i coś doradzi. ;)

Sam niezbyt wiele robię w czystym Windows API, więc nie mam jakiejś szczególnej wiedzy aby rozwiązać ten problem. Po mojemu to pasuje pobrać uchwyt okna i zarejestrować własną procedurę obsługi komunikatów tegoż okna, a w niej obsłużyć komunikaty dotyczące tego przycisku. Ale nigdy czegoś takiego nie robiłem, więc mogę się mylić.

0

Uchwyt okna akurat można łatwo uzyskać, ale pewnie nie do wszystkich programów. Ja akurat korzystam z jakiegoś gotowca z netu:

function ExeProcessToHWnd(ProcessName : string) : HWND;
  function EnumProcess(hHwnd : HWND; lParam : integer) : boolean; stdcall;
  var
    pPid : DWORD;
  begin
    Result := (hHwnd <> 0);
    if Result = True then
    begin
      GetWindowThreadProcessId(hHwnd, pPid);
      if pPid = PidNum then
      begin
        if (GetWindowLong(hHWND, GWL_HWNDPARENT) = 0)
          and (IsWindowVisible(hHWND) or IsIconic(hHWND)) then
        begin
          AHandle := hHWND;
        end;
      end;
    end;
    Result := True;
  end;

  function ProcessIDFromAppname32(AppName : string) : DWORD;
  var
    SnapShot : THandle;
    processEntry : TProcessEntry32;
  begin
    Result := 0;
    AppName := AnsiUpperCase(AppName);
    SnapShot := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
    if SnapShot <> 0 then
    try
      ProcessEntry.dwSize := SizeOf(ProcessEntry);
      if Process32First(SnapShot, ProcessEntry) then
        repeat
          if Pos(AppName, AnsiUpperCase(ExtractFilename
            (StrPas(processEntry.szExeFile)))) > 0 then
          begin
            Result := ProcessEntry.th32ProcessID;
            Break;
          end;
        until not Process32Next(SnapShot, ProcessEntry);
    finally
      CloseHandle(SnapShot);
    end;
  end;

begin
  PidNum := ProcessIDFromAppname32(ProcessName);
  EnumWindows(@EnumProcess, 0);
  Result := AHandle;
end;

Można także po "caption" okna

1 użytkowników online, w tym zalogowanych: 0, gości: 1