Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    VB6 - Attivare una form di un'applicazione esterna

    Salve a tutti.
    Ho un programma VB6 (un EXE standard) che si basa sulla tecnologia I-Object. Da questo programma viene aperto un form (di seguito lo chiamerò form1) contenuto in una dll ActiveX. Form1, all'apertura, lancia un'applicazione esterna (un'EXE ActiveX). Ad un certo punto da questa applicazione, richiamo una sub della dll che ho citato prima per aprire una nuova form contenuta in un'altra dll (di seguito lo chiamerò form2).
    Tramite l'istruzione
    codice:
    SetWindowPos frm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
    sono riuscita a portare in primo piano form2, solo che non risulta attivo. In pratica la barra del titolo "lampeggia" e il pulsante relativo alla form sulla barra delle applicazioni "lampeggia" e risulta colorato di arancione.
    Ho provato a usare
    codice:
    SendMessage frm.hwnd, WM_ACTIVATE, 0, 0
    ma non funziona.
    Questo però succede solo la prima volta. Se chiudo form2 e poi da form1 richiamo la suddetta sub, tutto funziona bene.
    Inoltre tramite il SetWindowPos la form2 viene portata in primo piano, solo che così non riesco a riportare in primo piano form1.
    Scusate ma non sono molto pratica di api.

    Qualcuno mi può aiutare?

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Prova con la funzione SetForegroundWindows


    codice:
    Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long

  3. #3
    Grazie per il suggerimento, ma purtroppo niente da fare. Si comporta ancora allo stesso modo!

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Per capire bene il 'giro' che fai occorerebbe avere i progetti da testare.
    Se puoi creare dei progettini che riproducano lo scenario ci si può dare un'occhiata.

    In effetti se i processi delle DL sono diffferenti, la SetFregroundWindow non funziona.

    Allore dovresti usare prima individuare il processo che ha aperto il form
    ed utilizzare la funzione API AllowSetForegroundWindow
    http://allapi.mentalis.org/apilist/A...ndWindow.shtml


    Comunque, riguardando bene la tua istruzione vedo che passi 0 wParam,
    mentre, come indicato sulla guida, questo messaggio richiede un valore diverso da 0 nel LOWORD di wParam :
    fActive = LOWORD(wParam); // activation flag

    che nel tuo caso dovrebbe essere WA_ACTIVE
    Private Const WA_ACTIVE As Long = 1


    Come simulare HIWORD, LOWORD, HIBYTE, LOBYTE macro C in VB
    http://support.microsoft.com/kb/112651


  5. #5
    Originariamente inviato da gibra
    Allore dovresti usare prima individuare il processo che ha aperto il form
    ed utilizzare la funzione API AllowSetForegroundWindow
    http://allapi.mentalis.org/apilist/A...ndWindow.shtml
    Grazie Gibra. Ho provato con AllowSetForegroundWindow e funziona tranne che per un piccolo particolare.
    La form2 viene messa in primo piano, risulta la finestra attiva (lo vedo dalla barra del titolo), ma guardando i pulsanti sulla barra delle applicazioni sembrerebbe attivo Form1.

    Inoltre quando si apre form2 io vorrei vedere:
    - sotto di tutto il programma principale (l'EXE per intenderci)
    - poi form1
    - infine form 2

    In realtà, form1 finisce sotto la form del programma principale e se clicco sul relativo pulsante sulla barra delle applicazioni, mi viene ridotto a icona come se fosse stata la finestra attiva.

    Se hai un'idea mi faresti un grosso favore, altrimenti penso che il risultato ottenuto sia più che accettabile.

    Non riesco a mandarti i sorgenti perchè (mi sono dimenticata di specificarlo), programmo sì in VB6, ma mi baso su un ambiente di sviluppo chiamato Estro (non so se l'hai mai sentito). Quindi i miei sorgenti non funzionerebbero sul tuo pc perchè è necessario installare anche l'ambiente di sviluppo.

    Grazie di tutto

  6. #6
    Originariamente inviato da gibra
    Comunque, riguardando bene la tua istruzione vedo che passi 0 wParam,
    mentre, come indicato sulla guida, questo messaggio richiede un valore diverso da 0 nel LOWORD di wParam :
    fActive = LOWORD(wParam); // activation flag

    che nel tuo caso dovrebbe essere WA_ACTIVE
    Private Const WA_ACTIVE As Long = 1


    Come simulare HIWORD, LOWORD, HIBYTE, LOBYTE macro C in VB
    http://support.microsoft.com/kb/112651
    Scusa se ti rompo ancora: volevo provare anche questo suggerimento, ma non ho ben capito questa parte.
    Intendevi solo che devo fare:
    codice:
    SendMessage frm.hwnd, WM_ACTIVATE, 0, 0
    Se sì, non funziona ugualmente.

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da patapatty
    Scusa se ti rompo ancora: volevo provare anche questo suggerimento, ma non ho ben capito questa parte.
    Intendevi solo che devo fare:
    codice:
    SendMessage frm.hwnd, WM_ACTIVATE, 0, 0
    Se sì, non funziona ugualmente.
    Se non ti vai a leggere la guida sul messaggio WM_ACTIVATE nn puoi capire.

  8. #8
    Originariamente inviato da gibra
    Se non ti vai a leggere la guida sul messaggio WM_ACTIVATE nn puoi capire.
    Ti ringrazio per il tempo che mi hai dedicato.
    Credo però che il tuo tono non sia adeguato. Se chiedo chiarimenti è perchè da sola non combino.
    Penso che se una persona si rivolge a un forum è perchè ormai le ha provate tutte e non sa più cosa fare (o per lo meno così mi comporto io).
    Sono un'isegnante e se mi rivolgessi così ai miei allievi non credo che farei bene il mio lavoro.

    Sono andata a leggere il link che mi hai mandato, ma non ci ho capito niente.
    Se invece non ti riferisci al link da te suggerito, mi puoi almeno dire dove trovo la guida sul messaggio WM_ACTIVATE.

    Grazie cmq di tutto. Penso di essere sulla strada giusta grazie ai tuoi suggerimenti.

    Ciao

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da patapatty
    Grazie Gibra. Ho provato con AllowSetForegroundWindow e funziona tranne che per un piccolo particolare.
    La form2 viene messa in primo piano, risulta la finestra attiva (lo vedo dalla barra del titolo), ma guardando i pulsanti sulla barra delle applicazioni sembrerebbe attivo Form1.

    Inoltre quando si apre form2 io vorrei vedere:
    - sotto di tutto il programma principale (l'EXE per intenderci)
    - poi form1
    - infine form 2
    E' davvero difficile darti indicazioni corrette, non conoscendo nulla del progetto.

    Dovresti trovare il modo di impostare il form 'owner' per ogni finestra, che di solito si fa con
    codice:
    Form1.Show , frmOwner
    puoi fare un tentativo con la funzione SetParent:
    codice:
    Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long


  10. #10
    Grazie di tutto.
    Credo di aver ottenuto quello che mi serviva con la AllowSetForegroundWindow.

    Ora farò vedere il tutto al cliente, ma penso che sarà soddisfatto.

    Grazie ancora e buon lavoro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.