Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 251
  • Last Modified:

Modify this code to Constrain app within a fixed position within panel (it opens an app within an app)

I need to know how to modify the following code to do the following questions

1. Is there a way to constrain the app I am opening in a fixed position within the panel?

2. Also is it possible to make my app resize to accommodate the opened app?

Public Class Form1

    Private Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer

    Private p As Process = Nothing

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If (p Is Nothing) OrElse p.HasExited Then
            p = Process.Start("calc")
            p.WaitForInputIdle()
            SetParent(p.MainWindowHandle, Panel1.Handle)
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Not (p Is Nothing) Then
            If Not p.HasExited Then
                p.CloseMainWindow() ' or p.Kill() if it doesn't have a GUI                
            End If
        End If
    End Sub

End Class
0
vbMarkO
Asked:
vbMarkO
  • 2
  • 2
  • 2
1 Solution
 
grayeCommented:
No, there is no clean way to have a separate process's window "dock" into another process's window (or control)

The alternative is to send windows API "events" to the running process to move/resize it relative to your control.   Unfortunately that's all done "by hand".... you performing all of the calculations and issuing the required events in code.

Let us know if you really wanna go down that path, we can help with the "low-level plumbing" to make it all work
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
You might be able to modify the windows styles using GetWindowLong() and SetWindowLong() to make it nonsizeable...would have to play with it...

That way it can't be "moved".

In this PAQ I remove the "minimize" button from a NotePad window:
http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22139099.html

Again...just talking out loud...haven't played with it yet...

0
 
vbMarkOAuthor Commented:
graye,


Yeah, if it will accomplish what I need I would ...   not as far as resizing no need for that ... I made my app of such that the other app will fit nicely just need to move it so it will center within panel1 or fill it either way which ever is easiest ...

So what are we talking about here code wise .....  alot?

Mark
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
Mike TomlinsonMiddle School Assistant TeacherCommented:
"just need to move it so it will center within panel1 or fill it either way which ever is easiest ..."

You can make the app Maximize to fill the Panel like this:

Public Class Form1

    Private Const SW_MAXIMIZE As Integer = 3

    Private Declare Function SetParent Lib "user32" Alias "SetParent" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
    Private Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal handle As IntPtr, ByVal nCmdShow As Integer) As Integer

    Private p As Process = Nothing

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If (p Is Nothing) OrElse p.HasExited Then
            p = Process.Start("NotePad")
            p.WaitForInputIdle()
            SetParent(p.MainWindowHandle, Panel1.Handle)
            ShowWindow(p.MainWindowHandle, SW_MAXIMIZE)
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If Not (p Is Nothing) Then
            If Not p.HasExited Then
                p.CloseMainWindow() ' or p.Kill() if it doesn't have a GUI                
            End If
        End If
    End Sub

End Class
0
 
vbMarkOAuthor Commented:
Idle_Mind,

You are da Man for sure .... that worked like a charm and is exactly what I was needing thanx a million ....

Mark
0
 
grayeCommented:
Humph... I learned something

I didn't know you could set the parent handle to a control for a "foriegn" process.  (So disregard my comments to the contrary!)
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 2
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now