Autor Beitrag
avoid
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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-test
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ausblenden 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); //warten bis Notepad auch ein Fenster geöffnet hat sonst gibt es kein Fensterhandle
SetParent(x.MainWindowHandle, this.Handle); // unser Fenster als Parent des Main Fensters von Notepad setzen
SendMessage(x.MainWindowHandle, 274614880); // Notepad in unserem Fenster maximieren

Für diesen Beitrag haben gedankt: avoid
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: Fr 01.02.13 13:09 
ich hab es jetzt mal so versucht.

ausblenden volle Höhe C#-Quelltext
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; // für [DllImport("user32.dll")]
using System.Diagnostics; // für Process
using System.Threading; // für Thread

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); //warten bis Notepad auch ein Fenster geöffnet hat sonst gibt es kein Fensterhandle
            SetParent(x.MainWindowHandle, panel1.Handle); // unser Fenster als Parent des Main Fensters von Notepad setzen
            SetWindowLong(x.MainWindowHandle, -160);
            SendMessage(x.MainWindowHandle, 274614880);
        }
    }
}

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: Fr 01.02.13 14:05 
ich hab den code jetzt nochmal mit einem anderen programm ausprobiert
und den code nochmal etwas umgestrickt.

ausblenden 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); //warten bis Notepad auch ein Fenster geöffnet hat sonst gibt es kein Fensterhandle
    SetParent(x.MainWindowHandle, panel1.Handle); // unser Fenster als Parent des Main Fensters von Notepad setzen
    SetWindowLong(x.MainWindowHandle, -160);
    SendMessage(x.MainWindowHandle, 274614880);
}

private void Form1_Resize(object sender, EventArgs e)
{
    SetWindowLong(x.MainWindowHandle, -160);
    SendMessage(x.MainWindowHandle, 274614880);
}


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if (e.Button == MouseButtons.Left)
{
    // kopieren
    Clipboard.SetDataObject(pictureBox104.Image, true);

    // einfügen
    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