Newsgroup: it.comp.lang.visual-basic
Titolo: Gestione finestre esterne al programma

Ho un programma che deve inserire un testo all'interno di una finestra (ad
esempio quella che si apre con commondialog.showsave).
Adesso uso una soluzione di questo tipo:
TimerSendKeys.Enabled = True
'Apri finestra
Sub TimerSendKeys_Timer()
    SendKeys "C:\Ciao.txt" & "{ENTER}" 'scrive nella finestra
    TimerSendKeys.Enabled = False
End Sub
In questo modo uso il timer per scrivere all'interno della finestra (in
quanto l'istruzione che apre la finestra blocca l'applicazione finchè la
finestra non viene chiusa (dal timer)).
Ci sono 2 grossi problemi:
- Il principale: Il programma deve *sempre* avere il focus, altrimenti il
sendkeys va all'applicazione sbagliata.
- Il secondario: Sarebbe bello riuscire ad avere un evento per sapere quando
la finestra si apre... adesso ho settato il timer a 2 secondi.
Mi sembra strano che con tutte le API non si possa accedere al textbox
dentro la finestra che viene aperta... non esiste qualcosa tipo l'hDC delle
immagini?
V I   P R E G O   A I U T A T E M I ! ! ! ! !
Grazie
Ciao
Bald0z

 immagini?
Mai provato con la dialog, comunque, prova così, magari funziona anche :P
Questa la funzioncina che mi sono fatto per sapere l'hWnd del controllo
attivo (l'hWnd corrisponde all'hDC per le finestre).
Function GetWindow(ByVal Child As Boolean) As Long
    Dim t_id As Long
    Dim c_t_id As Long
    If Child Then
        'Get the selected control of the foreground window
        t_id = GetWindowThreadProcessId(hwnd, 0&)
        c_t_id = GetWindowThreadProcessId(GetForegroundWindow, 0&)
        Call AttachThreadInput(c_t_id, t_id, True)
        GetWindow = GetFocus()
        Call AttachThreadInput(c_t_id, t_id, False)  'Restore the input
queue
    Else
        GetWindow = GetForegroundWindow()
    End If
End Function
Poi usi la SetText() per passare il testo desiderato.
Con un po' di fortuna il fuoco ti cade sul textbox del nome del file :) e
quindi potrebbe anche funzionare :))
Ciao

 quindi potrebbe anche funzionare :))
Uhm, adesso ci provo, però io speravo in una soluzione che non avesse
bisogno del fuoco, in quanto col fuoco funziona anche adesso...
Magari un modo per *dare* fuoco alla finestra?
Mah, sicuramente sarà più stabile del SendKeys questo metodo (se funziona).
Mo lo provo.
Grazie mille!
Ciao
Bald0z

>         t_id = GetWindowThreadProcessId(hwnd, 0&)
Questa funzione da dove la prendo?
Non ho mai capito dove vanno tutti a prendere le funzioni delle API e le
corrispettive dichiarazioni :(
Grazie
Ciao
Bald0z

 corrispettive dichiarazioni :(
ApiViewer.
Public Declare Function GetWindowThreadProcessId Lib "user32" Alias
"GetWindowThreadProcessId" (ByVal hwnd As Long, lpdwProcessId As Long) As
Long
Ciao
------------------------- SiDB Simple DataBase engine ----
------------------------- adParser Expression evaluator --
 
http://space.virgilio.it/zntf...@tin.it/
----------------------------------------------------------

 Mo lo provo.
Puoi trovare l'hwnd del controllo tramite id.Per trovare l'id del controllo
(visto che è sempre uguale) potresti usare il tools Spy che intercetta
eventi e id dei vari processi.Conoscendo l'hwnd della finestra(qualsiasi
finestra che ti interessa controllare) puoi ottenere l'hwnd del controllo da
modificare tramite l'id .Non ricordo l'api per ottenere l'hwnd da id ma non
è difficle da trovare su msdn.L'ho usato un po di tempo fa ma credo di
averti dato tutte le informazioni utili.Se hai bisogno altro chiedi pure.


Mitico!
Quindi l'id della finestra non cambia neanche da computer a computer?
WHooooho!!!!!

 WHooooho!!!!!
del controllo non della finestra
parlo di controlli windows (textbox pulsanti....)

 parlo di controlli windows (textbox pulsanti....)
Ovviamente...
Ciao e grazie mille per l'informazione, mi sei stato molto utile!!
Bald0z

> ApiViewer.
Wow!
Thank you, finalmente ho anch'io la mia risorsa di dichiarazioni :P
Ciao
Bald0z

 attivo (l'hWnd corrisponde all'hDC per le finestre).
Scusa se continuo a rompere....
Io ho trovato questa:
The FindWindow function retrieves a handle to the top-level window whose
class name and window name match the specified strings. This function does
not search child windows. This function does not perform a case-sensitive
search
Che mi sembra più facile per quello che devo fare io, perchè *non* ha
bisogno del fuoco.
Però mi chiede:
LPCTSTR lpClassName,  // pointer to class name
LPCTSTR lpWindowName  // pointer to window name
Il window name ce l'ho; ma il class name no.
Allora vado a vedere la funzione:
[START]
The GetClassName function retrieves the name of the class to which the
specified window belongs.
int GetClassName(
  HWND hWnd,           // handle of window
  LPTSTR lpClassName,  // address of buffer for class name
  int nMaxCount        // size of buffer, in characters
);
Parameters
  hWnd
  Handle to the window and, indirectly, the class to which the window
belongs.
  lpClassName
  Pointer to the buffer that is to receive the class name string.
  nMaxCount
  Specifies the length, in characters, of the buffer pointed to by the
lpClassName parameter. The class name string is truncated if it is longer
than the buffer.
[END]
Ma non capisco che cosa gli devo mandare come "lpClassName "...
Vi prego, illuminatemi.
Grazie!
Ciao
Bald0z