Fenster sollen sich nur inerhalb eines Panels bewegen

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Fenster sollen sich nur inerhalb eines Panels bewegen

    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:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal flag As Integer) As IntPtr
    4. Private Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    5. Private Const SW_NORMAL As Integer = 1
    6. Private Const SW_MAXIMIZE As Integer = 3
    7. Private h As IntPtr
    8. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    9. Timer1.Start()
    10. End Sub
    11. Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    12. ReleaseApplicationAsChild()
    13. End Sub
    14. Private Sub SetApplicationAsChild(ByVal CallingApplication As String, ByVal p As System.Windows.Forms.Panel)
    15. Dim hProcess As System.Diagnostics.Process = Process.GetProcessesByName(CallingApplication)(0)
    16. If hProcess.MainWindowHandle <> 0 Then
    17. ' Parent Fenster setzen.
    18. SetParent(hProcess.MainWindowHandle, p.Handle)
    19. 'hProcess.WaitForInputIdle()
    20. 'Fenster anzeigen.
    21. ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE)
    22. 'handle merken, um beim freigeben weniger stress zu haben
    23. h = hProcess.MainWindowHandle
    24. Else
    25. MessageBox.Show("Kein gültiges Fensterhandle - Anwendung kann nicht eingebettet werden.")
    26. 'Me.Button1.Enabled = True
    27. 'Me.Button2.Enabled = False
    28. End If
    29. End Sub
    30. Private Sub ReleaseApplicationAsChild()
    31. 'parent der anwendung wieder löschen
    32. SetParent(h, Nothing)
    33. 'fenster der anwendung anzeigen
    34. ShowWindow(h, SW_NORMAL)
    35. 'button sperren
    36. End Sub
    37. Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    38. 'prozessliste aktualisieren - um alle geöffneten fenster erfassen zu können
    39. Timer1.Stop()
    40. Dim index As Integer = Me.ListBox1.SelectedIndex
    41. 'alle prozesse die einen fenstertitel haben in die listbox eintragen
    42. Me.ListBox1.Items.Clear()
    43. For Each p As Process In Process.GetProcesses
    44. If p.MainWindowTitle <> "" Then
    45. Me.ListBox1.Items.Add(p.ProcessName)
    46. End If
    47. Next
    48. Me.ListBox1.SelectedIndex = index
    49. Timer1.Start()
    50. End Sub
    51. Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
    52. If ListBox1.SelectedItem = "" Then
    53. Else
    54. If Panel1.HasChildren = True Then
    55. ReleaseApplicationAsChild()
    56. SetApplicationAsChild(ListBox1.SelectedItem, Panel1)
    57. Else
    58. SetApplicationAsChild(ListBox1.SelectedItem, Panel1)
    59. End If
    60. End If
    61. End Sub
    62. End Class


    vieleicht wisst ihr ja eine bessere Methode...
    Was funktioniert daran nicht, wie äußert sich das?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @supercyrex
    Verstehst du es nicht?
    Dann schreib diesen Code woanders, nicht im Timer...
    Wenn der Timer sich wiederholt, dann führt sich der Code erneut aus und das immer wieder und wieder...
    Und irgendwann hängt es sich auf. :wacko:


    @Gonger96
    Wäre auch ne Möglichkeit... Allerdings kommt sonst nur das in Frage

    supercyrex schrieb:

    Denk ich mal.....
    Mach das zunächst raus und überleg, dass Du nur neue Prozesse aufnimmst, die wiederholen sich sonst bei jedem Timer-Tick.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Gonger96 schrieb:


    Daran liegts auch nicht. Stell einfach Strict On

    Wenn ich Option Strict auf ON setzte bekomm ich eine Fehlermeldung:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal flag As Integer) As IntPtr
    3. Private Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    4. Private Const SW_NORMAL As Integer = 1
    5. Private Const SW_MAXIMIZE As Integer = 3
    6. Private h As IntPtr
    7. Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    8. Timer1.Start()
    9. End Sub
    10. Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    11. ReleaseApplicationAsChild()
    12. End Sub
    13. Private Sub SetApplicationAsChild(ByVal CallingApplication As String, ByVal p As System.Windows.Forms.Panel)
    14. Dim hProcess As System.Diagnostics.Process = Process.GetProcessesByName(CallingApplication)(0)
    15. If hProcess.MainWindowHandle <> 0 Then
    16. 'hier bekomm ich die Fehlermeldung:
    17. 'Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "<>" mit diesen Argumenten aufgerufen werden kann: "Public Shared Operator <>(value1 As System.IntPtr, value2 As System.IntPtr) As 'Boolean": "Option Strict On" lässt keine impliziten Konvertierungen von Integer in System.IntPtr zu.
    18. SetParent(hProcess.MainWindowHandle, p.Handle)
    19. 'hProcess.WaitForInputIdle()
    20. 'Fenster anzeigen.
    21. ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE)
    22. 'handle merken, um beim freigeben weniger stress zu haben
    23. h = hProcess.MainWindowHandle
    24. Else
    25. MessageBox.Show("Kein gültiges Fensterhandle - Anwendung kann nicht eingebettet werden.")
    26. 'Me.Button1.Enabled = True
    27. 'Me.Button2.Enabled = False
    28. End If
    29. End Sub
    30. Private Sub ReleaseApplicationAsChild()
    31. 'parent der anwendung wieder löschen
    32. SetParent(h, Nothing)
    33. 'fenster der anwendung anzeigen
    34. ShowWindow(h, SW_NORMAL)
    35. 'button sperren
    36. End Sub
    37. Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    38. 'prozessliste aktualisieren - um alle geöffneten fenster erfassen zu können
    39. Timer1.Stop()
    40. Dim index As Integer = Me.ListBox1.SelectedIndex
    41. 'alle prozesse die einen fenstertitel haben in die listbox eintragen
    42. Me.ListBox1.Items.Clear()
    43. For Each p As Process In Process.GetProcesses
    44. If p.MainWindowTitle <> "" Then
    45. Me.ListBox1.Items.Add(p.ProcessName)
    46. End If
    47. Next
    48. Me.ListBox1.SelectedIndex = index
    49. Timer1.Start()
    50. End Sub
    51. Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
    52. If ListBox1.SelectedItem.ToString = "" Then
    53. Else
    54. If Panel1.HasChildren = True Then
    55. ReleaseApplicationAsChild()
    56. SetApplicationAsChild(CStr(ListBox1.SelectedItem), Panel1)
    57. Else
    58. SetApplicationAsChild(CStr(ListBox1.SelectedItem), Panel1)
    59. End If
    60. End If
    61. End Sub
    62. End Class


    Ich denke nicht das es an Option Strict liegt.
    Deswegen klappts ja nicht ^^
    0 ist ein Integer kein Intptr.

    VB.NET-Quellcode

    1. If hProcess.MainWindowHandle <> IntPtr.Zero Then
    2. SetParent(hProcess.MainWindowHandle, p.Handle)
    3. ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE)
    4. h = hProcess.MainWindowHandle
    5. Else
    6. MessageBox.Show("Kein gültiges Fensterhandle - Anwendung kann nicht eingebettet werden.")
    7. End If