2012-11-30 40 views
3

我想在面板內或應用程序內部運行應用程序。這是一個模擬器前端。你瀏覽遊戲,然後當你選擇一個遊戲時,它會啓動模擬器。我發現下面的代碼,它適用於我的項目vb.net在窗體內部啓動應用程序

Public Class Form1 
    Declare Auto Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer 
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer 
    Private Const WM_SYSCOMMAND As Integer = 274 
    Private Const SC_MAXIMIZE As Integer = 61488 
    Dim proc As Process 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     proc = Process.Start("C:\WINDOWS\notepad.exe") 
     proc.WaitForInputIdle() 

     SetParent(proc.MainWindowHandle, Panel1.Handle) 
     SendMessage(proc.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0) 
    End Sub 
End Class 

如果我嘗試用記事本,甚至zsnesw.exe它的工作好,但如果我試圖通過一些參數zsnesw它那種怪胎和我必須重新啓動計算機(我無法切換應用程序,甚至無法打開任務管理器)。

此外,即使它起作用,開始菜單也會彈出,就像我切換到另一個應用程序一樣。這是我首先想要避免的,因爲我的應用程序是全屏顯示的。

+0

好吧,我沒有繼續前進,用記事本,而不是仿真器再次嘗試,它的工作要好得多內「運行計算器應用程序。我仍然想知道這是不是一個好主意......似乎有很多失敗的可能性 –

回答

4

我明白了!

 Dim proc As Process 
     proc = Process.Start(emuPath + "zsnesw", "-m """ + selGame.romPath + """") 
     proc.WaitForInputIdle() 
     SetParent(proc.MainWindowHandle, Me.Panel1.Handle) 
     SendMessage(proc.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0) 
     Me.BringToFront() 

問題1:我經過參數不正確。我正在嘗試使用Process.StartInfo.Arguments。由於某種原因沒有工作。在Process.Start中使用逗號可以正常工作。

問題2:我添加了Me.BringToFront()來再次隱藏開始菜單。

1

使用了Thread.Sleep ;)

是Panel2控制

Dim proc As Process 
proc = Process.Start("Calc.exe") 
proc.WaitForInputIdle() 
Thread.Sleep(1000) 
SetParent(proc.MainWindowHandle, Me.Panel2.Handle) 
Thread.Sleep(1000) 
SendMessage(proc.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0) 
相關問題