Newsgroup: it.comp.lang.visual-basic
Titolo: Send Message... & Co.

Buongiorno a tutti, avrei bisogno del vostro aiuto :-)
Ho bisogno di inviare del testo da un mio programma, ad un programma
in esecuzione... per fare un esempio un mio applicativo VB dovrebbe
inviare del testo a un'istanza di word in esecuzione.
Per fare ciò, scritto un programmino che enumera gli handle di ogni
programma in esecuzione... di seguito includo il codice:
INIZIO Modulo ****************************
Option Explicit
'---- Win32 API function declarations
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long,
ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As
Long
Declare Function GetWindowTextLength Lib "user32" Alias
"GetWindowTextLengthA" (ByVal hwnd As Long) As Long
'Public Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam
As Any) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal
lParam As Long) As Long
'---- Starts enumeration
Public Sub Enumerate()
    EnumWindows AddressOf EnumWindowsProc, 0
End Sub
'---- Enumeration callback procedure
Private Function EnumWindowsProc(ByVal hwnd As Long, _
    ByVal lParam As Long) As Boolean
    ' Get Window text
    Dim sTxt As String
    sTxt = String(GetWindowTextLength(hwnd) + 1, Chr(0))
    GetWindowText hwnd, sTxt, Len(sTxt)
    ' Add to the list
    frmMain.lstWindows.AddItem Left(sTxt, Len(sTxt) - 1) _
        & " (" & hwnd & ")"
    ' Return True to proceed with enumeration
    EnumWindowsProc = True
End Function
FINE Modulo ******************************
INIZIO FORM ******************************
'*** AGGIUNGERE UNA LISTBOX di nome lstWindows***
'---- Load
Private Sub Form_Load()
    ' Enumerates the windows
    Enumerate
End Sub
Private Sub Form_Resize()
    ' Adjusts listbox
    lstWindows.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
FINE Form ********************************
e la list box, elenca correttamente gli handle di tutti i programmi in
esecuzione.
ho poi provato a utilizzare send message.... nell'evento click della
lista ho scritto
******* CODICE *******
Dim WM_SETTEXT
WM_SETTEXT = "12"
Dim sMsg
sMsg = "Ciao da Alex" & vbCrLf & "WELLAAAAA"
Call SendMessage(val(lstWindows), &HC, 0, ByVal sMsg)
*** FINE CODICE ******
ma mi da sempre e comunque "tipo non corrispondente", sulla riga "Call
SendMessage(131838, &HC, 0, ByVal sMsg)".... ho provato a passare
direttamente il valore numerico dell'handle, ma non cambia nulla... mi
aiutate per favore?
Ciao Alessandro

Ciao Alessandro
Probabilmente nn è questa la soluzione, ma guardando MSDN ho scoperto
che per quanto riguarda la dichiarazione del MSG deve essere fatta in
un modulo di classe, nn in uno normale. Magari è una cazzata ma prova
a vedere un pò.
MSDN:
' L'istruzione Declare deve essere Private in un modulo
' di classe ma non in un modulo standard.
Private Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
Sub CallMyDll()
fammi sapere se risolvi.
Andrea.

 Ciao Alessandro
Ciao, in realtą il SendMessage viene utilizzato per spedire messaggi di
sistema tra i componenti di windows; spedisce anche messaggi relativi a
pressioni di tasti, ma dovresti spedire un carattere alla volta e inoltre
penso che tu debba anche codificare il codice ascii in "codice tastiera".
Se ho capito bene ciņ che vuoi fare forse basterebbe l'istruzione SendKeys
che "simula" la digitazione di caratteri da tastiera e li invia
all'applicazione attiva.

 ' di classe ma non in un modulo standard.
E' scritta da cani: significa che se la declare è in un modulo di classe
*deve* essere privata, altrimenti *può* essere pubblica.
Comunque non funzionerebbe lo stesso poichè l'handle della finestra di word
*non* è la finestra della sua "textbox": insomma setterebbe la caption :)
Occorre sapere com'è la dichiarazione che ha usato e le dichiarazioni delle
variabili passate.
Ciao

 all'applicazione attiva.
Prima di tutto, ti ringrazio!!!! :-)
il send keys non č molto comodo.. perchč l'applicativo da "pilotare",
deve essere iconificato... mio programma in sostanza, costituisce un
"espansione", per quello esistente...
ciaop

 Andrea.
E' per questo che sono qui :-)
Mi serve aiuto, non so neppure dove inziare... :(

"espansione", per quello esistente...
Scusa, ed usare l'automazione OLE?
Dim objWordDoc As Word.Application
Set objWordDoc = GetObject(, "Word.Application")
objWordDoc.Selection.TypeText "ciao..."
Set objWordDoc = Nothing
Referenzia MS Word Object Library.
Se la GetObject non può istanziare objWordDoc significa che Word non è
attivo.
Ciao,
Moreno
-- 
sirri at morenosoft dot com
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------