5

パネル内またはアプリケーション内の何かでアプリを実行したいと考えています。エミュレータのフロントエンドです。ゲームをブラウズし、ゲームを選択するとエミュレーターが起動します。次のコードを見つけて、自分のプロジェクトに適応させました

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 にいくつかのパラメーターを渡そうとすると、ちょっとおかしくなり、コンピューターを再起動する必要があります (アプリケーションを切り替えたり、タスクを開くことさえできません)。マネジャー)。

また、動作していても、別のアプリに切り替えたようにスタートメニューがポップアップします。これは、私のアプリが全画面表示であるため、そもそも回避しようとしていたことのようなものです。

4

2 に答える 2

6

うまくいきました!

        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() を追加して、スタート メニューを再び非表示にしました。

于 2012-11-30T20:10:29.817 に答える
2

Thread.Sleep を使用してください ;)

'Panel2 コントロール内で Calc アプリケーションを実行

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)
于 2014-06-27T12:10:34.783 に答える