AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

"Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

Ein Thema von erich.wanker · begonnen am 24. Mai 2012 · letzter Beitrag vom 24. Mai 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
453 Beiträge
 
Delphi XE4 Professional
 
#1

"Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:10
Hallo Leute,

ich schaff es nicht !! eine ganz einfache Sache zu lösen...

Wenn ich auf einen Button klicke soll "Calc.exe" gestartet werden - und wenn der Taschenrechner bereits gestartet wurde, soll er (falls er minimiert ist..) sw_restore gesendet bekommen und focusiert werden...

schöne Grüße aus dem verregneten Gasteinertal
Erich

Hier mein Versuch:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, LMDCustomComponent, LMDStarter, StdCtrls;

type
  TForm1 = class(TForm)
    LMDStarter1: TLMDStarter;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    BitBtn1: TBitBtn;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  tlhelp32, ShellAPI;


{$R *.dfm}

//********************************************************
// programm starten oder SW_Restore ausführen *
//********************************************************
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  hProcess: THandle;
  wf: DWORD;
begin

    hProcess := GetProcessHandleFromID(GetProcessID('calc.exe'));

    if hProcess = 0 then
     begin
        LMDstarter1.StartOperation:=smOpen; // Programm läuft nicht - also starten
        LMDstarter1.Execute;
     end
     else
     begin
        Hole_Fenster_in_den_Vordergrund('Rechner');
        SwitchToThisWindow(hProcess, True); // Programm läuft - also anzeigen
        ForceForegroundWindow(hProcess);
        ShowWindow(hProcess,SW_Restore);
        BringWindowToTop(hProcess);

     end;

end;



//********************************************************
// Versuch 1 *
//********************************************************
function GetProcessID(Exename: string): DWORD;
var
  hProcSnap: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  if hProcSnap <> INVALID_HANDLE_VALUE then
  begin
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
    begin
      while Process32Next(hProcSnap, pe32) = true do
      begin
        if pos(Exename, pe32.szExeFile) <> 0 then
          result := pe32.th32ProcessID;
      end;
    end;
    CloseHandle(hProcSnap);
  end;
end;

function GetProcessHandleFromID(ID: DWORD): THandle;
begin
  result := OpenProcess(SYNCHRONIZE, False, ID);
  CloseHandle(result);
end;



//********************************************************
// Versuch 2 *
//********************************************************
function ForceForegroundWindow(hwnd: THandle): Boolean;
const
  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
  ForegroundThreadID: DWORD;
  ThisThreadID: DWORD;
  timeout: DWORD;
begin
  if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);

  if GetForegroundWindow = hwnd then Result := True
  else
  begin
    // Windows 98/2000 doesn't want to foreground a window when some other
    // window has keyboard focus

    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
      ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
      ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
      (Win32MinorVersion > 0)))) then
    begin
      // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
      // Converted to Delphi by Ray Lischner
      // Published in The Delphi Magazine 55, page 16

      Result := False;
      ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
      ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
      if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
      begin
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hwnd);
        AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
        Result := (GetForegroundWindow = hwnd);
      end;
      if not Result then
      begin
        // Code by Daniel P. Stasinski
        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
          SPIF_SENDCHANGE);
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
      end;
    end
    else
    begin
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hwnd);
    end;

    Result := (GetForegroundWindow = hwnd);
  end;
end; { ForceForegroundWindow }





//********************************************************
// Versuch 3 *
//********************************************************
procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
  external user32 Name 'SwitchToThisWindow';
         {x = false: Size unchanged, x = true: normal size}






//********************************************************
// Versuch 4 *
//********************************************************
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..260] of char;
begin
  // Get the first window
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin
    // retrieve its text
    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;




//********************************************************
// Versuch 5 *
//********************************************************
procedure Hole_Fenster_in_den_Vordergrund ( Programmname : String);
var h_Prog : hwnd;
begin
  // Funktion holt Fenster in den Vordergrund
   h_Prog := FindWindowByTitle(Programmname);
   if (h_Prog <> 0) then
    begin
     h_Prog := GetWindow(h_Prog, GW_OWNER); // Owner-Handle holen (Handle des TApplication-Fensters)
      if IsIconic(h_Prog) then
       ShowWindow(h_Prog, SW_RESTORE); // restoren wenn minimiert
         ForceForegroundWindow(h_Prog);
         BringWindowToTop(h_Prog);
    end;
end;











// Unit ende!
end.
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:21
Delphi-Quellcode:
var
 h:THandle;
begin
 h := FindWindow(nil,'Rechner');
 if h=0 then Shellexecute(handle,'open','calc.exe','','',sw_Show)
 else
  begin
  SetForegroundWindow(h );
  end;
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:27
Das ist aber nicht sehr zuverlässig, es kann ja auch noch andere Fenster mit dem Titel "Rechner" geben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:34
schtümpt ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:38
Evtl. hilft dieser Thread schonmal etwas weiter.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#6

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:48
Das ist aber nicht sehr zuverlässig, es kann ja auch noch andere Fenster mit dem Titel "Rechner" geben.
Mit der entsprechenden Fensterklasse wird es schon zuverlässiger:
Delphi-Quellcode:
var
 h:THandle;
begin
 h := FindWindow('SciCalc','Rechner'); // Fensterklasse explizit benannt
 if h=0 then Shellexecute(handle,'open','calc.exe','','',sw_Show)
 else
  begin
  SetForegroundWindow(h );
  end;
end;
Gruß, teebee
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:51
Auf einem deutschen Windows, ja.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 15:56
Auf einem deutschen Windows, ja.
Geht auch nur mit der Klasse ohne Titel.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 16:01
Das weiß ich auch. Nur denke ich mir, dass es zuverlässiger wäre, das Fenster über den Pfad zu ermitteln, es wird ja wohl kaum einer die calc.exe im System32-Ordner überschrieben haben. Problematisch wird das nur, wenn man sie in ein anderes Verzeichnis kopiert und daraus gestartet hat (aber wer macht denn sowas?).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#10

AW: "Calc.exe" starten oder wenn bereits aktiv: SW_Restore schicken

  Alt 24. Mai 2012, 16:10
Das weiß ich auch.
Hab ich auch nicht angezweifelt

Letzten Endes wird man immer ein Szenario konstruieren können, und sei es noch so unwahrscheinlich, in dem die aufwändigste Lösung nicht funktioniert.

Gruß, teebee
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:49 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