?
Solved

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

Posted on 2007-04-02
6
Medium Priority
?
233 Views
Last Modified: 2010-04-23
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
Comment
Question by:vbMarkO
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
  • 2
6 Comments
 
LVL 41

Expert Comment

by:graye
ID: 18837547
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
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 18837583
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
 

Author Comment

by:vbMarkO
ID: 18838269
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
Industry Leaders: 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!

 
LVL 86

Accepted Solution

by:
Mike Tomlinson earned 2000 total points
ID: 18838335
"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
 

Author Comment

by:vbMarkO
ID: 18838830
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
 
LVL 41

Expert Comment

by:graye
ID: 18839312
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

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you're writing a .NET application to connect to an Access .mdb database and use pre-existing queries that require parameters, you've come to the right place! Let's say the pre-existing query(qryCust) in Access takes a Date as a parameter and l…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
In this video you will find out how to export Office 365 mailboxes using the built in eDiscovery tool. Bear in mind that although this method might be useful in some cases, using PST files as Office 365 backup is troublesome in a long run (more on t…
Suggested Courses

765 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question