Oppure

Loading
05/08/09 13:27
fusebyte
Tentar non nuoce.
A questo punto conviene fare una DLL in NET e poi richiamare esternamente (con quale comando?) l'exe desiderato in quel momento.

Imports System.Runtime.InteropServices 
Public Class Form1 
    <DllImport("user32.dll")> _ 
    Public Shared Function FindWindow(ByVal ZeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr 
    End Function 
    <DllImport("user32.dll")> _ 
    Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr 
    End Function 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
        Dim p As New Process 
        p.StartInfo.FileName = "notepad.exe" 
        p.Start() 'per far partire il processo 
        Threading.Thread.Sleep(2000) 'attendo che il processo si apra 
        Dim winh As New IntPtr 
        winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow 
        SetParent(winh, Me.Handle) 'Setto il Form padre Con SetParent 
    End Sub 
End Class


Come dovrebbe essere modificato il tuo codice per fare questo?

Ciao
aaa
05/08/09 14:08
manvb.net
Qui non possiamo parlare di vb6, ma anche il codice vb6 che ti ho dato sopra deve funzionare, vb6 o vb.net o c++ o c# o quello che vuoi tu non cambia niente quando si tratta di winapi(e terminiamo qui l'Off-Topic sul vb6).
aaa
05/08/09 18:21
fusebyte
Come dovrebbe essere modificato il tuo codice per fare questo?
-------------------------------------------------------------

Scusami ,credo che mi sono mal espresso.
non intendevo chiedere di convertire il codice in VB6 siamo gia' andati OT pure troppo,ma chiedevo come dovrebbe essere modificato
il codice VB.NET per fare una DLL in NET
per poi richiamare sempre da NET
un qualsiasi EXE tramite una CALL della DLL
e chiedevo di sapere la riga di comando per richiamare la DLL e l'EXE voluto.

Cosi' mi sembra lecita la richiesta ed attinente al Forum.

Ciao,grazie anticipate.

aaa
05/08/09 23:38
manvb.net
Fare una call da unmanaged a managed è un impiccio(purtroppo). Fai prima(e meglio) a scrivere quelle due righe in vb6(mi scuso per tutto questo ot), non capisco dove sia il problema, le api danno gli stessi risultati con tutti i lang.
Ultima modifica effettuata da manvb.net 07/08/09 15:09
aaa
07/08/09 12:33
fusebyte
Partendo dal tuo codice NET

Sono riuscito a caricare l 'EXE dentro il Form ,ho 3 problemi pero'

1)Ora quando chiudo il Form non riesco a chiudere l'applicazione

2)Quando apro l'applicazione la devo sempre tirare su' col mouse e vorrei che si aprisse allineata al Form

3) se chiudo il Form e chiudo l'applicazione(a manina per adesso),quando riapro il Form
l'applicazione si carica fuori dal Form.

Ci sto ammattendo da 3 giorni e non ne vengo a capo,se ti va di aiutarmi
la risposta in VB.NET va benissimo.

Ciao
aaa
07/08/09 15:12
manvb.net
Ti serve che il codice sia convertibile in altri lang(quindi uso solo api) oppure vanno bene le classi vb.net(non convertibili in altri lang)?
aaa
07/08/09 19:57
fusebyte
Se non ti dispiace vanno benissimo le API,visto che sono le stesse per tutti i linguaggi
e le devo usare spesso approfitto per imparare qualcosa.

Grazie,Ciao
aaa
08/08/09 14:00
manvb.net
Ecco, questo dovrebbe funzionare:

Imports System.Runtime.InteropServices
Public Class Form1
    <DllImport("user32.dll")> _
    Public Shared Function FindWindow(ByVal ZeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr
    End Function
    <DllImport("user32.dll")> _
    Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    End Function
    <DllImport("user32.dll")> _
    Public Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As IntPtr
    End Function
    <DllImport("user32.dll")> _
    Public Shared Function DestroyWindow(ByVal hWnd As IntPtr) As IntPtr
    End Function



    Dim winh As New IntPtr 'Sposto l'handle tra le variabili globali così può essere visto da tutti gli eventi

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        DestroyWindow(winh)
    End Sub


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim p As New Process
        p.StartInfo.FileName = "notepad.exe"
        p.Start() 'per far partire il processo
        Threading.Thread.Sleep(2000) 'attendo che il processo si apra
        winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow
        SetParent(winh, Me.Handle) 'Setto il Form padre Con SetParent
        Threading.Thread.Sleep(1000) 'attendo per sicurezza :)
        MoveWindow(winh, 0, 0, 600, 400, True)
    End Sub
End Class


Scusa se ho risposto in ritardo ma avevo da fare.
Ultima modifica effettuata da manvb.net 08/08/09 14:01
aaa