hi,
Jch will es irgenwie bewerkstelligen das sich alle geöfnetten Fenster nur inerhalb des Bereiches bewegen können der von einem Panel abgedeckt wird.
Ich hab das schonmal mit so einer Methode versucht: [VB.NET] Prozess in die eigene Anwendung einbetten und wieder freigeben. aber das klappt nicht so wie ich mir das vorgestellt habe.
Mein Code:
vieleicht wisst ihr ja eine bessere Methode...
Jch will es irgenwie bewerkstelligen das sich alle geöfnetten Fenster nur inerhalb des Bereiches bewegen können der von einem Panel abgedeckt wird.
Ich hab das schonmal mit so einer Methode versucht: [VB.NET] Prozess in die eigene Anwendung einbetten und wieder freigeben. aber das klappt nicht so wie ich mir das vorgestellt habe.
Mein Code:
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Public Class Form1
- Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal flag As Integer) As IntPtr
- Private Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
- Private Const SW_NORMAL As Integer = 1
- Private Const SW_MAXIMIZE As Integer = 3
- Private h As IntPtr
- Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
- Timer1.Start()
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- ReleaseApplicationAsChild()
- End Sub
- Private Sub SetApplicationAsChild(ByVal CallingApplication As String, ByVal p As System.Windows.Forms.Panel)
- Dim hProcess As System.Diagnostics.Process = Process.GetProcessesByName(CallingApplication)(0)
- If hProcess.MainWindowHandle <> 0 Then
- ' Parent Fenster setzen.
- SetParent(hProcess.MainWindowHandle, p.Handle)
- 'hProcess.WaitForInputIdle()
- 'Fenster anzeigen.
- ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE)
- 'handle merken, um beim freigeben weniger stress zu haben
- h = hProcess.MainWindowHandle
- Else
- MessageBox.Show("Kein gültiges Fensterhandle - Anwendung kann nicht eingebettet werden.")
- 'Me.Button1.Enabled = True
- 'Me.Button2.Enabled = False
- End If
- End Sub
- Private Sub ReleaseApplicationAsChild()
- 'parent der anwendung wieder löschen
- SetParent(h, Nothing)
- 'fenster der anwendung anzeigen
- ShowWindow(h, SW_NORMAL)
- 'button sperren
- End Sub
- Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- 'prozessliste aktualisieren - um alle geöffneten fenster erfassen zu können
- Timer1.Stop()
- Dim index As Integer = Me.ListBox1.SelectedIndex
- 'alle prozesse die einen fenstertitel haben in die listbox eintragen
- Me.ListBox1.Items.Clear()
- For Each p As Process In Process.GetProcesses
- If p.MainWindowTitle <> "" Then
- Me.ListBox1.Items.Add(p.ProcessName)
- End If
- Next
- Me.ListBox1.SelectedIndex = index
- Timer1.Start()
- End Sub
- Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
- If ListBox1.SelectedItem = "" Then
- Else
- If Panel1.HasChildren = True Then
- ReleaseApplicationAsChild()
- SetApplicationAsChild(ListBox1.SelectedItem, Panel1)
- Else
- SetApplicationAsChild(ListBox1.SelectedItem, Panel1)
- End If
- End If
- End Sub
- End Class
vieleicht wisst ihr ja eine bessere Methode...