Autor |
Beitrag |
avoid
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Fr 01.02.13 11:43
ich hab schon etwas beim google und hier im forum gesucht,
die fundgrube hat sich aber nicht wirklich gefüllt.
wohl auch, weil ich keine idee habe nach was ich da suchen soll.
erst mal ein bild das veranschaulichen soll was ich möchte.
notepad habe hier nur als beispiel verwendet.
erst mal die frage, geht sowas überhaupt?
und dann die frage wo setze ich an?
für meine zwecke brauch ich nicht mal eine interaktion
aber wenn ich mein tool starte soll das andere programm darin gestartet sein.
gruß,
avoid
Einloggen, um Attachments anzusehen!
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 01.02.13 12:00
Die Windows API gibt das her das man Fenster beliebiger Anwendungen parenten kann. Winforms wird dir da direkt nicht weiterhelfen.
Beispiel
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
Process x = Process.Start("Notepad.exe"); Thread.Sleep(1000); SetParent(x.MainWindowHandle, this.Handle); SendMessage(x.MainWindowHandle, 274, 61488, 0); |
Für diesen Beitrag haben gedankt: avoid
|
|
avoid 
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Fr 01.02.13 13:09
ich hab es jetzt mal so versucht.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; namespace testform { public partial class Form1 : Form { [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
[DllImport("user32.dll")] static extern int SetWindowLong(IntPtr hWnd, int nIndex, UInt32 dwNewLong);
public Form1() { InitializeComponent();
Process x = Process.Start("Notepad.exe"); Thread.Sleep(1000); SetParent(x.MainWindowHandle, panel1.Handle); SetWindowLong(x.MainWindowHandle, -16, 0); SendMessage(x.MainWindowHandle, 274, 61488, 0); } } } |
der nebenefekt das sich die menüleiste des notepad ausgraut,
wenn ich in meiner anwendung rum klicke,
kann ich das noch abstellen oder muß ich damit leben?
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 01.02.13 13:30
Zitat: | kann ich das noch abstellen oder muß ich damit leben? |
Vermutlich. Es kann in Windows immer nur ein Control den Focus haben und wenn kein Child Control des Notepad Fensters den Focus hat sind die Menüs ausgegraut oder was auch immer ein Fenster anstellt wenn es denn Focus nicht hat.
|
|
avoid 
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Fr 01.02.13 14:05
ich hab den code jetzt nochmal mit einem anderen programm ausprobiert
und den code nochmal etwas umgestrickt.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Process x;
public Form1() { InitializeComponent(); x = Process.Start("C:\\Programme\\Tracker Software\\PDF Viewer\\PDFXCview.exe"); Thread.Sleep(1000); SetParent(x.MainWindowHandle, panel1.Handle); SetWindowLong(x.MainWindowHandle, -16, 0); SendMessage(x.MainWindowHandle, 274, 61488, 0); }
private void Form1_Resize(object sender, EventArgs e) { SetWindowLong(x.MainWindowHandle, -16, 0); SendMessage(x.MainWindowHandle, 274, 61488, 0); } |
gelegentlich kommt es so aber vor, das mein mainform sich nicht mehr kleiner schieben lässt.
mein panel hat "Anchor=Top, Bottom, Left, Right" und "Autosize=True".
leider hab ich keine ahnung was SetWindowLong und SendMessage genau bewirken,
doch da müßte wohl noch was geändert werden.
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 01.02.13 14:15
Beim SendMessage hab ichs ja noch dran geschrieben. Das Fenster wird maximiert. Mit SetWindowLong ändert man die Form Properties. Versucht du den Border los zu werden oder das Systemmenü?
Wenn das maximieren hier stört kannst du mal versuchem mit MoveWindow oder SetWindowPos die Größe des Fensters selbst festzulegen und eben beim resizen des parents immer nachzuziehen.
|
|
avoid 
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Fr 01.02.13 15:38
mir ging es um die obere blaue leiste, die bekomm ich mit -16 abgeschalten.
ohne die kann der nutzer nicht versehendlich das fenster verschieben.
die untere statusleiste kann ruig da bleiben.
---- nachtrag -----
eine frage hätte ich aber noch.
wenn ich jetzt doch eine aktion der eingebetteten anwendung von meinem tool her auslösen möchte.
z.b. das drücken von STRG+V z.b.
wie mache ich das, auch mit SendMessage() ?
---- nochmal nachtrag ----
ich hab es jetzt mal so versucht und es scheind zu klappen.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if (e.Button == MouseButtons.Left) { Clipboard.SetDataObject(pictureBox104.Image, true);
SetForegroundWindow(x.MainWindowHandle); Thread.Sleep(20); SendKeys.SendWait("^(v)"); } |
wenn ich nun anstelle der pictureBox104 die angeklickte haben möchte.
das muß ich nochmal nach sehen.
aber sonst gehts.
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
|