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
209 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 total points
Comment Utility
"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
Comment Utility
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
Comment Utility
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

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Suggested Solutions

This tutorial demonstrates one way to create an application that runs without any Forms but still has a GUI presence via an Icon in the System Tray. The magic lies in Inheriting from the ApplicationContext Class and passing that to Application.Ru…
Microsoft Reports are based on a report definition, which is an XML file that describes data and layout for the report, with a different extension. You can create a client-side report definition language (*.rdlc) file with Visual Studio, and build g…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

772 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now