AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Button in einer fremden Anwendung aktivieren
Thema durchsuchen
Ansicht
Themen-Optionen

Button in einer fremden Anwendung aktivieren

Ein Thema von musicman56 · begonnen am 18. Okt 2013 · letzter Beitrag vom 19. Okt 2013
Antwort Antwort
musicman56
(Gast)

n/a Beiträge
 
#1

Button in einer fremden Anwendung aktivieren

  Alt 18. Okt 2013, 17:07
Hallo API-Spezialisten,

ich möchte von meinem Programm aus die Windows-Wählhilfe starten und in das Eingabefeld die Telefonnummer schreiben. Das klappt auch wunderbar. Das Problem ist, der Button [Wählen] in der Wahlhilfe wird dadurch nicht aktiviert. Erst wenn der User die Telefonnummer im Eingabefeld nochmals ändert, ist der Button aktiviert. Die Abhilfe wäre wohl, dem Button oder dem Eingabefeld eine weitere Message zur Aktivierung zu schicken, aber welche, das ist meine Frage bzw. mein Problem.

Es soll mal eine Konsolen-Anwendung werden, aber zum Testen hab ich erst mal eine Form erstellt.

Delphi-Quellcode:
unit HwpDialer;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TFrmHwpDialer = class(TForm)
    Nummer: TEdit;
    Label1: TLabel;
    BtnDial: TButton;
    BtnClose: TButton;
    BtnReset: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
    procedure BtnDialClick(Sender: TObject);
    procedure BtnCloseClick(Sender: TObject);
    procedure BtnResetClick(Sender: TObject);
  private
    { Private-Deklarationen }
    FAppHandle, FEditHandle, FDialButtonHandle: THandle;
    FHandleList: TStrings;
  public
    { Public-Deklarationen }
    function WindowsDialerStart: boolean;
    function WindowsDialerInit: boolean;
  end;

var
  FrmHwpDialer: TFrmHwpDialer;

implementation

uses ShellAPI;

{$R *.dfm}

resourcestring
  rsWahlhilfeCaption = 'Wählhilfe';
  rsEditClassname = 'Edit';
  rsButtonDialClassName = 'Button';
  rsWahlhilfeExeName = 'Dialer.exe';

function EnumChilds(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
  Result := True;
  FrmHwpDialer.FHandleList.Add(IntToStr(hwnd));
end;

procedure TFrmHwpDialer.FormCreate(Sender: TObject);
begin
  FHandleList := TStringList.Create;
  BtnDial.Enabled := WindowsDialerInit;
end;

procedure TFrmHwpDialer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FHandleList.Free;
end;

procedure TFrmHwpDialer.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  Resize := false;
end;

procedure TFrmHwpDialer.BtnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TFrmHwpDialer.BtnDialClick(Sender: TObject);
begin
  // Hat der User die Wählhilfe beendet...?
  if not WindowsDialerStart then exit;
  // Minimiertes Fenster normal anzeigen
  if IsIconic(FAppHandle) then ShowWindow(FAppHandle, SW_RESTORE);
  // In den Vordergrund
  SetForegroundWindow(FAppHandle);
  // Text an das Editfeld schicken
  SendMessage(FEditHandle,WM_Settext,0,Integer(PChar(Nummer.Text)));
end;

procedure TFrmHwpDialer.BtnResetClick(Sender: TObject);
begin
  BtnDial.Enabled := WindowsDialerInit;
end;

{ Public-Deklarationen }

function TFrmHwpDialer.WindowsDialerStart: boolean;
var
  SEI: TShellExecuteInfo;
begin
  FillChar(SEI, SizeOf(SEI), #0);
  SEI.cbSize := SizeOf(SEI);
  SEI.Wnd := Handle;
  SEI.fMask := SEE_MASK_NOCLOSEPROCESS;
  SEI.lpVerb := 'open';
  SEI.lpFile := PChar(rsWahlhilfeExeName);
  SEI.lpParameters := nil;
  SEI.lpDirectory := nil;
  SEI.nShow := SW_SHOW;
  try
    Result := ShellExecuteEx(@SEI);
  except
    on E:Exception do Showmessage(E.Message);
  end;
  CloseHandle(SEI.hProcess);
end;

function TFrmHwpDialer.WindowsDialerInit: boolean;
const
  iClassNameSize = 128;
var
  i: integer;
  H: THandle;
  ClassName: array[0..iClassNameSize] of char;
  WC: TWndClass;
begin
  if FAppHandle > 0 then
  if FindWindow(nil,PChar(rsWahlhilfeCaption)) = FAppHandle then Exit(True);
  Result := false;
  FEditHandle := 0;
  FDialButtonHandle := 0;
  FHandleList.Clear;
  FAppHandle := FindWindow(nil,PChar(rsWahlhilfeCaption));
  {-wenn die Wählhilfe nicht läuft....starten-}
  if FAppHandle = 0 then begin
    if not WindowsDialerStart then exit;
    FAppHandle := FindWindow(nil,PChar(rsWahlhilfeCaption));
  end;
  if FAppHandle > 0 then begin
    EnumChildWindows(FAppHandle, @EnumChilds, FAppHandle);
    for i := 0 to Pred(FHandleList.Count) do begin
      H := StrToInt(FHandleList[i]);
      GetClassName(H,ClassName,iClassNameSize);
      if GetClassInfo(H,@ClassName,WC) then begin
        {-Eingabefeld-}
        if SameText(rsEditClassName,string(WC.lpszClassName))
        then FEditHandle := H;
        {-Botton-}
        if SameText(rsButtonDialClassName,string(WC.lpszClassName)) then begin
          {-Button gefunden...aber welcher ??? }
          FDialButtonHandle := H;
        end;
      end;
      if (FDialButtonHandle > 0) and (FEditHandle > 0) then Exit(true);
    end;
  end;
end;

end.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.643 Beiträge
 
Delphi 12 Athens
 
#2

AW: Button in einer fremden Anwendung aktivieren

  Alt 18. Okt 2013, 18:35
Ich wollte mal in einer HTML Seite Daten automatisch ausfüllen und dann den "Senden" Button ferngesteuert drücken. Da das nicht funkionierte, habe ich irgendwo nachgefragt und man sagte mir, dass dies aus Sicherheitsgründen nicht gehen würde.
Vielleicht ist das auch bei dir ein Sicherheitsproblem, denn man könnte ja ohne Zutun eines Users eine Telefonnummer wählen.
Ist aber nur so eine Idee.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#3

AW: Button in einer fremden Anwendung aktivieren

  Alt 18. Okt 2013, 19:04
Hallo Matthias,

die Sicherheitsbedenken kann ich verstehen. Aber, ich möchte den Button gar nicht drücken, sondern nur "enablen". Ich vermute, dass es sich um das "OnChange"-Ereignis handelt, das in der Wahlhilfe nicht abgefragt wird. Wahrscheinlich haben die MS-Programmierer nur Tastendruck im Edit-Feld ausgewertet, und somit bekommt das Programm gar nicht mit, dass sich der Inhalt des Eingabefeldes geändert hat. Dann müsste man dem Edit-Feld "einen Key unterjubeln" aber auch da weiß ich nicht, wie das geht.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Button in einer fremden Anwendung aktivieren

  Alt 18. Okt 2013, 20:13
Delphi XE2 und dann PChar? .. hmmm na gut.

gruss
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#5

AW: Button in einer fremden Anwendung aktivieren

  Alt 18. Okt 2013, 21:40
Delphi XE2 und dann PChar? .. hmmm na gut.

gruss
Vielen Dank für deinen hilfreichen Kommentar. Darf ich fragen, wo du ein Problem hast?

In der Delphi-Hilfe für XE2 steht:

System.PWideChar
type PWideChar = ^Char;

System.PChar
type PChar = ^Char;
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#6

AW: Button in einer fremden Anwendung aktivieren

  Alt 18. Okt 2013, 21:49
Hallo,

hast Du es schon mal so versucht?
Delphi-Quellcode:
if not IsWindowEnabled (FDialButtonHandle) then
  EnableWindow (FDialButtonHandle, LongBool (True))
Gruß
Volker Zeller
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#7

AW: Button in einer fremden Anwendung aktivieren

  Alt 19. Okt 2013, 09:13
Hallo,

Problem vorerst mit WM_CHAR gelöst. Bin gerade dabei alle OS durchzuchecken.

@Volker

Habe ich nicht in Erwägung gezogen, weil ich keinen sicheren Weg kenne herauszufinden, welcher von den 20 Buttons der richtige ist. Das wäre ja Bestandteil meiner Frage gewesen. Jetzt schicke ich dem Edit eine WM_CHAR und das enabled dann den Button. Vielleicht klappts ja mit allen OS.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz