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
219 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
  • 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 85

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
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 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

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

This article explains how to create and use a custom WaterMark textbox class.  The custom WaterMark textbox class allows you to set the WaterMark Background Color and WaterMark text at design time.   IMAGE OF WATERMARKS STEPS Create VB …
Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…

840 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