Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di maz85
    Registrato dal
    Mar 2003
    Messaggi
    75

    [VB.NET] Usare Sendmessage per impostare proprietà ad un form esterno

    Salve, sono appena passato su visual basic .net e ne stavo approffittando per fare un po' di esercizio.
    Dunque volevo modificare le proprietà di un form qualsiasi, mi ricordo che con VB6 ero riuscito ad ottenere l'handle delle finestre usando le Api e modificare la caption del form e dei controlli con sendmessage.
    Purtroppo ho perso il progetto.

    Sul vb.net vorrei, avendo già trovato l'handle, cambiare una qualche proprietà del form identificato con l'handle.
    Mi interesserebbe cambiare il text (il caption del vb6) e l'opacity e, se possibile, usare l'handle in questione per stampare quel form.

    codice:
    Imports System.Runtime.InteropServices
    Imports System.Drawing.Printing
    
    Public Class frm_prova
    
        Public Const WM_SETTEXT = &HC
    
        Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    
        Private Sub frm_prova_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
             SendMessage(2754032, WM_SETTEXT, 0, 0) '2754032 handle di prova
    
        End Sub
    End Class
    In questo esempio si azzera il text al form con l'handle selezionato (anche se non con tutti funziona), però non so come impostare il testo e le altre proprietà di cui parlavo (anche se ho dato un'occhiata a queste costanti http://www.vbcode.com/Asp/showsn.asp?theID=11797).

    Potete aiutarmi?

    Edit: mi sono accorto che dovevo dichiarare lParam come String e dunque SendMessage(2754032, WM_SETTEXT, 0, "testoprova") funziona, ma stranamente non su tutte. :master:.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    L'handle e' variabile da oggetto ad oggetto e da chiamata a chiamata ... non puoi usare un valore costante (2754032) ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di maz85
    Registrato dal
    Mar 2003
    Messaggi
    75
    Si, quello è un valore prova che ho recuperato durante il test.
    In fase di test esisteva una finestra con handle 2754032.

    Comunque è tutta stamattina e adesso che cerco un modo per modificare le proprietà di un windows.form qualsiasi (chessò la finestra di notepad..ecc...) avendo l'handle.
    Il massimo che sono riuscito a fare è usare WM_SETTEXT per cambiare il nome della finestra, non so come accedere alle altre proprietà, non riesco a cavare un ragno dal buco.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Notepad e' una finestra Win32, non una "windows.form" (.NET per intenderci).

    Per potere interagire con le finestre Win32, possedendone l'handle, devi inviare specifici messaggi come

    WM_SETTEXT

    e tutti quelli previsti che trovi elencati su MSDN.

    Ovviamente, se quello che vuoi modificare non corrisponde ad un messaggio di Windows riconosciuto dalla finestra, allora non potrai farlo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di maz85
    Registrato dal
    Mar 2003
    Messaggi
    75
    Stavo pensando, ci sono programmi che rendono semitrasparenti le finestre (ne gira qualcuno sul web) dunque questi programmi lasciati aperti modificherrano una proprietà della finestra, ma... con quale metodo? Un sendmessage su qualche proprietà? Dunque con quale messaggio? O con che altra api? Tipo SetLayeredWindowAttributes?

    Infatti stavo provando questo:
    (ometto le dichiarazioni delle api usate)

    codice:
            Dim hwnd As Integer
            hwnd = 3147626  //hwnd di una finestra esistente
            'MsgBox(CStr(hwnd))
    
            Dim style As Long
            'WS_EX_LAYERED va impostato come stile per ottenere l'alfa
            style = GetWindowLong(hwnd, GWL_EXSTYLE)
            If Not (style And WS_EX_LAYERED = WS_EX_LAYERED) Then
                style = style Or WS_EX_LAYERED
                SetWindowLong(hwnd, GWL_EXSTYLE, style)
            End If
    
            'Imposto alfa (128)
            SetLayeredWindowAttributes(hwnd, 0&, 128, LWA_ALPHA)
    però nessuna trasparenza... nemmeno se imposto hwnd= Me.handle (però ha effetto il sendmessage quindi non sono problemi di handle).

  6. #6

  7. #7
    Utente di HTML.it L'avatar di maz85
    Registrato dal
    Mar 2003
    Messaggi
    75
    Sono riuscito a farlo ritornando su Visual Basic 6 e utilizzando il codice di prima (un po' diverso però, ho tralasciato il controllo sullo stile).

    @Gibra: oggi sono particolarmente rincoglionito, cosa mi è sfuggito?

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da maz85
    @Gibra: oggi sono particolarmente rincoglionito, cosa mi è sfuggito?
    La prima risposta di Oregon.

  9. #9
    Utente di HTML.it L'avatar di maz85
    Registrato dal
    Mar 2003
    Messaggi
    75
    Gli handle funzionano benissimo, ho scritto il numero handle di test perchè l'ho trovato tramite un programma tipo spy++ giusto per testare in una finestra aperta in quel momento.
    Poi utilizzerò findwindow.
    Ot: ne approfitto per chiedere qui visto che non l'ho trovato sul forum o su google, esiste un qualcosa dato il solito handle di finestra che me la stampa? Devo stampare finestre di applicazioni non mie senza ricorrere ad un cattura schermo ecc...

  10. #10
    Utente di HTML.it L'avatar di maz85
    Registrato dal
    Mar 2003
    Messaggi
    75
    Ho notato che il compilando con vb2006 non va su Vista, quindi mi sono spostato su Vb.Net.
    Però così le stesse chiamate alle api non vanno (SetWindowLong ecc..) e guardando il return mi da un numero 8979207406388215808 (!=0 quindi funzione eseguita con successo)
    L'unica cosa che va a buon fine e il sendmessage WM_SETTEXT per la caption.
    Ovviamente ho apportato le giuste modifiche vb2006>vb.net.
    Ho controllato i tipi di dati passati ecc... e mi pare tutto regolare.
    Secondo voi?

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.