Autor Beitrag
Tony-S
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Di 01.03.11 01:00 
Hallo Delphi-Forum, ich suche eine Möglichkeit um ein Bild aus der Zwischenablage in andere Anwendungen als Paint zu exportieren.

Dazu rufe ich über die ShellAPI Paint auf:

ausblenden Delphi-Quelltext
1:
ShellExecute(Application.Handle,'open', pchar('mspaint.exe]'),nilNil, SW_Show);					


Als nächstes rufe ich eine Funktion auf die nach einem Fenster mit dem Klassennamen "MSPaintAPP", sucht und dann aus der Zwischenablage heraus ein Bild einfügt.
ausblenden Delphi-Quelltext
1:
Window := FindWindow(PChar('MSPaintAPP'), nil);					


Den Klassennamen des Fensters fand ich mit dem Tool "Property Edit" heraus.

Jetzt ist meine Frage an euch, wie ich aus einem Delphi-Programm heraus, den Nutzer selbst wählen lasse, in welches Programm er sein Bild aus der Zwischenablage einfügen will. Man muss ja wissen, wie die exe des Programms und wie der Klassenname des Fensters ist.

Wäre euch sehr dankbar, wenn mir jemand sagen kann, wie man da vorzugehen hat. Wenn ihr den Rest des Codes braucht, wie ich es mit Paint gemacht habe, einfach bescheid sagen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.03.11 06:43 
Biete ihm einen Auswahldialog (OpenDialog) an, wo er das Programm (die Exe) auswählen kann. Die meisten solcher Programme sollten wohl auch das Öffnen als Parameter unterstützen, so dass du das Fenster nicht suchen musst.
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Di 01.03.11 20:17 
Danke, das war schon mal ein guter Ansatz.
Ich hab mir das so gedacht, dass man einfach die Verknüpfung des jeweiligen Programms anklickt und man so das Programm hinzufügt - das funktioniert auch!

Sprich wenn ich "einfache" Anwendungen wie Paint und Gimp öffne ist das kein Problem,
mit Word geht das z. B. nicht, da erhalte ich dann so etwas kryptisches wie "wordicon.exe":

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmExename.btnOpenClick(Sender: TObject);
var Programmname: String;
begin
    if OpenDialog1.Execute then
    begin
    Programmname := Extractfilename(OpenDialog1.FileName);
    ShellExecute(Application.Handle,'open', pchar(Programmname),nilNil, SW_Show);
    end;
end;


Ich brauche allerdings trotzdem den Klassennamen des Fensters, ich öffne ja Paint und warte bis es auch wirklich offen ist und DANN füge ich die Zwischenablage ein.

So hab ich das gemacht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure SendBMPtoPaint;
var
  Window: HWND;
begin
  Window := 0;
  repeat
    Window := FindWindow(PChar('MSPaintAPP'), nil);
    Application.ProcessMessages;
  until Window <> 0;
  begin
  if Window > 0 then
  begin
  SetForegroundWindow(Window);
  keybd_event(vk_Control, MapVirtualKey(vk_Control, 0), 00);
  keybd_event(vkKeyScan('V'), MapVirtualKey(vkKeyScan('V'), 0), 00);
  keybd_event(vkKeyScan('V'), MapVirtualKey(vkKeyScan('V'), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(vk_Control, MapVirtualKey(vk_Control, 0), KEYEVENTF_KEYUP, 0);
  end;
  end;
end;


//Paint aufrufen und "Strg + V" drücken:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TfrmBMP.btnPaintExportClick(Sender: TObject);
begin
Clipboard.SetAsHandle(CF_BITMAP, hGlobal(imgBMP.Picture.Bitmap));
Clipboard.Assign(imgBMP.Picture.Bitmap);
  Try
  ShellExecute(Application.Handle,'open', pchar('mspaint.exe'),nilNil, SW_Show);
  Finally
  SendBMPtoPaint;
end;


Also mir kommt es ja vor allem darauf an, die Bilder aus der Zwischenablage in Word und Outlook zu exportieren,
wenn die unterschiedlichen Office-Exe-Dateien z. B. immer winword.exe etc heißen(?) könnte man diese immer leicht aufrufen. Da ist aber wie gesagt das Problem das man die richtige exe zu Word usw. schwer findet, Gimp etc macht da keine Probleme, jedoch besteht bei beiden das Problem, das ich den Namen des Fensters nicht wissen kann um es einzufügen...

Wie machen das denn andere Programme?
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 01.03.11 21:16 
Hey

wie luckie schon gesagt hat: übergib es als parameter beim öffnen des programms...

Mfg Bergmann

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 01.03.11 21:36 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Wie machen das denn andere Programme?
Gar nicht, auf so ein Konzept kommt einfach fast niemand außer dir...

Wenn der Benutzer etwas per Copy & Paste einfügen möchte, dann kann er das in dem anderen Programm mit Strg + V tun. So funktioniert nun einmal fast jede Windows Anwendung.

Wenn ein Programm eine Datei übergeben bekommen soll, dann als Parameter.

Ein wenig ungewöhnlicher, aber auch möglich ist, dass du ins Zielfenster klicken lässt und der Benutzer dann einen vorher mit RegisterHotkey registrierten Hotkey drückt. Dann kannst du direkt Strg + V simulieren. Das kann aber auch gleich der Benutzer machen.

Letztlich sehe ich keinen Sinn in dem Vorhaben. :nixweiss:

Einen Export im eigentlichen Sinn macht man indem man direkt die Datei in dem Format schreibt...
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Di 01.03.11 21:45 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Wie machen das denn andere Programme?
Gar nicht, auf so ein Konzept kommt einfach fast niemand außer dir...


Das klingt irgendwie "herablassend", aber gut ok.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Letztlich sehe ich keinen Sinn in dem Vorhaben. :nixweiss:


Einfach aus Bequemlichkeit heraus, der Nutzer klickt gleich auf "Outlook" und kann das Bild senden.
Oder er kann es mit einem Klick in ein Word Dokument einfügen, in sofern macht das schon Sinn.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Einen Export im eigentlichen Sinn macht man indem man direkt die Datei in dem Format schreibt...


Das ist doch eine Antwort mit der ich leben kann, dann geht es eben nicht, danke.
Steve1024
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Di 01.03.11 23:35 
schau mal nach word und ole automatisierung.
dann speicherst halt dein bild als jpg oder so temporär ab und fügst es dann ein.
dann brauchst auch keine fenster wissen bzw macht das die ole für dich.

_________________
- posted with HTC HD2 -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 02.03.11 07:10 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Das klingt irgendwie "herablassend", aber gut ok.
Sorry, so war das nicht gemeint. Ich meinte, dass es eben nicht in die normale Bedienung von Programmen hineinpasst, und ich deshalb bisher nur sehr selten etwas in der Richtung gelesen habe.

user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
Einfach aus Bequemlichkeit heraus, der Nutzer klickt gleich auf "Outlook" und kann das Bild senden.
Oder er kann es mit einem Klick in ein Word Dokument einfügen, in sofern macht das schon Sinn.
Das geht ja. Wenn du dem Benutzer sagst, dass er auf das Zielprogramm klicken soll, dann kannst du einfach den Tastendruck Strg + V danach dort aktivieren sobald ein anderes Fenster den Eingabefokus hat.

Also es geht vielleicht schon, aber elegant ist etwas anderes. Vor allem weil der Nutzer ja ohnehin nur einfügen drücken müsste im Zielprogramm.

Für sowas bietet sich aber eine Toolleiste an, die so eingestellt ist, dass sie nicht den Fokus bekommt. Dann kann der Benutzer im Zielprogramm sein und in deiner Leiste auf Einfügen klicken ohne dass das Zielfenster den Fokus verliert. Das müsste gehen, ich weiß auswendig gerade nicht wie, man muss dafür den Fensterstil in CreateParams ändern glaube ich.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 02.03.11 07:21 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  Try
  ShellExecute(Application.Handle,'open', pchar('mspaint.exe'),nilNil, SW_Show);
  Finally
  SendBMPtoPaint;
end;
Die Stelle solltest Du aber dringend überarbeiten. Außerdem fehlt da ein "end;". Falls das Programm nicht gestartet werden kann, landest Du in einer Endlosschleife in der Prozedur SendBMPtoPaint.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 02.03.11 07:26 
Stimmt, ShellExecute wirft ohnehin keine Exception, sondern gibt einen Fehler als Rückgabewert zurück (siehe Doku). Der wird dort aber einfach mal weggeworfen und ignoriert...
FrEaKY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: Do 24.03.11 19:28 
wie wäre es mit
ausblenden Quelltext
1:
 SendMessage(PaintHandle, WM_DROPFILES, ...)					

Paint und die meisten anderen unterstützen doch Drag&Drop.