Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Sendmessage Explorer öffnen (https://www.delphipraxis.net/171160-sendmessage-explorer-oeffnen.html)

DelphiPeter 23. Okt 2012 19:41

Sendmessage Explorer öffnen
 
Hallo Freunde!

Kann mir mal jemand einen Tipp geben? Ich würde gerne den Windows Explorer per SendMessage öffnen, den Titel des Fensters um einen String ergänzen. Danach würde ich gerne die Ansicht filtern, oder selektieren. Ich weiß nicht, was geht, oder wo ich das nachlesen kann. Am liebsten wäre mir, ich könnte in diesem Fenster nur bestimmte Dateien und ordner anzeigen.

Wo muss ich nachlesen, was muss ich tun?


Peter

Bummi 23. Okt 2012 19:49

AW: Sendmessage Explorer öffnen
 
Sendmessage an wen sollte eine Anwendung starten?
AFAIK wirst Du eine Filterung wie gewünscht mit dem Explorer nicht hinbekommen ...
Was (nimm mal an mit dem Explorer ginge es nicht) brauchst Du, gegf. wofür, viellicht gibt es andere Ansätze

DelphiPeter 23. Okt 2012 20:10

AW: Sendmessage Explorer öffnen
 
Hallo Bummi!

Ich möchte den Windows Explorer starten. Ich weiß das ich den Explorer über ShellExecute aufrufen kann und mittels BEfehlszeilenparameter auch dazu bringen kann, eine oder mehrere Dateien zu selektieren. Wenn ich sowas per SendMessage hinbekommen könnte, und dann noch den Fenster Titel abändere wäre ich schon ziemlich weit.

Hier noch der Link zum MSDN [MSDN]http://support.microsoft.com/kb/130510/de[/MSDN]


Peter

Bummi 23. Okt 2012 20:25

AW: Sendmessage Explorer öffnen
 
Der Aufruf per Shellexecute oder per CreateProcess ist klar, die Caption wenn sie je nach Windowsversion noch vorhanden ist per Sendmessage ändern ist auch klar, wie Du allerdings per reinem SendMessage da hin kommen willst ist mir völlig unklar...

DelphiPeter 23. Okt 2012 20:32

AW: Sendmessage Explorer öffnen
 
Naja, die Idee stammt daher, das ich mit Sendmessage auf jedes Fenster zugreifen kann das in Windows existiert. Würde ich also einen Explorer starten könnte ich das FensterHandle ermitteln - nur wie es dann weiter geht ist mir unklar.

Bummi 23. Okt 2012 21:48

AW: Sendmessage Explorer öffnen
 
wenn ich statt explorer.exe, Notepad.exe verwende bekomme ich das erwartete.
Mit explorer.exe funktioniert der Aufruf, vom SetText bekommt man unter Windows 7 allerdings nichts mit, vielleicht hilft es Dir als Basis zum basteln ...
Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

    { Private-Deklarationen }
    PID:DWord;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
var
s:String;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  NameDesProgramms = 'C:\windows\explorer.exe';
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_SHOW;
  if CreateProcess( PChar(NameDesProgramms),' /select,c:\windows\system32\calc.exe',nil, nil, false,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo,
    ProcessInfo) then
    try
      PID := ProcessInfo.dwProcessId; //PID ist eine private DWORD-Variable
    finally
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
end;

type
  PEnumInfo = ^TEnumInfo;
  TEnumInfo = record ProcessID: DWORD; HWND: THandle; end;

function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
    var
      PID: DWORD;
    begin
      GetWindowThreadProcessID(Wnd, @PID);
      Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or (not IsWindowEnabled(WND));
      if not Result then EI.HWND := WND;
    end;

  function FindMainWindow(PID: DWORD): DWORD;
    var
      EI: TEnumInfo;
    begin
      EI.ProcessID := PID;
      EI.HWND := 0;
      EnumWindows(@EnumWindowsProc, Integer(@EI));
      Result := EI.HWND;
    end;

procedure TForm1.Button2Click(Sender: TObject);
var
 wnd:Hwnd;
begin
  if PID <> 0 then
      begin
      wnd:=FindMainWindow(PID);
      if WND<>0 then
        begin
          s := 'Test';
          SendMessage(wnd,wm_Settext,0,Integer(@s[1]));
        end;
      end;

end;
end.

DelphiPeter 24. Okt 2012 09:31

AW: Sendmessage Explorer öffnen
 
Hallo Thomas,

vielen Dank für dein Beispiel. Ich werde mich da mal reindenken und herumspielen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 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