Autor |
Beitrag |
Tony-S
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: 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:
Delphi-Quelltext 1:
| ShellExecute(Application.Handle,'open', pchar('mspaint.exe]'),nil, Nil, 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.
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
|
Verfasst: 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 
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: 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":
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),nil, Nil, 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:
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), 0, 0); keybd_event(vkKeyScan('V'), MapVirtualKey(vkKeyScan('V'), 0), 0, 0); 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:
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'),nil, Nil, 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
      
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)
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 01.03.11 21:36
Tony-S hat folgendes geschrieben : | 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.
Einen Export im eigentlichen Sinn macht man indem man direkt die Datei in dem Format schreibt...
|
|
Tony-S 
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: Di 01.03.11 21:45
|
|
Steve1024
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 02.03.11 07:10
Tony-S hat folgendes geschrieben : | 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.
Tony-S hat folgendes geschrieben : | 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 02.03.11 07:21
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 235
D7
|
Verfasst: Do 24.03.11 19:28
wie wäre es mit
Quelltext 1:
| SendMessage(PaintHandle, WM_DROPFILES, ...) |
Paint und die meisten anderen unterstützen doch Drag&Drop.
|
|
|