Newsgroup: it.comp.lang.c++
Titolo: Funzione API Postmessage

Con la funzione Postmessage devo riuscire ad attivare un menu di un'altro
programma e fare click su una delle voci . Come lo posso fare con la
funzione Postmessage.
Sono riuscito a farla funzionare con il messaggio WM_CLOSE , ma non so quali
messaggi utilizzare e come utilizzarli ( alcuni infatti richiedono dei
parametri aggiuntivi ) per , appunto attivare un menu e selezionare una
voce.

 wrote in message 7na3v3$9m2$1...@nslave1.tin.it...


"FURYO T.System." wrote:

Ci sono diverse cose da dire, comunque la linea di condotta generale è:
- ottenere l'handle della finestra proprietaria del menù --- Ci sono diversi
modi per farlo, ma siccome hai detto che riesci a usare WM_CLOSE suppongo che
tu ci sia già riuscito
- ottenere l'handle del menù --- HMENU GetMenu( HWND hWnd  // handle of window
);
- ottenere l'handle del SubMenu --- HMENU GetSubMenu( HMENU hMenu // handle of
menu, int nPos // menu item position  ); (per esempio il menù file che è
presente in quasi tutti i programmi è il primo quindi GetSubMenu(hMenu, 0))
- ottenere l'ID della voce di menu che ci interessa --- UINT GetMenuItemID(
HMENU hMenu, int nPos);
- eseguire il comando associato a quella voce ---(PostMessage) o
SendMessage(hWnd, WM_COMMAND, MenuItemID, NULL);
Devo ammettere che non ho provato per vedere se funziona (ci sono diverse
complicazioni possibili) comunque dovrebbe funzionare, ma magari non ho
nemmeno capito cosa volevi fare (magari volevi fare una specie di tutorial e
quindi muovere il mouse, cliccare sui menu e aprire le varie funzioni perchè
l'utente potesse imparare a utilizzare il programma); comunque se c'è qualche
problema fammelo sapere e prometto di metterci più impegno ;-)
Ciao, Fulvio.

 wrote in message
37A022D8...@mbox.dinamica.it...



Scusa , non so se stai parlando ancora del mio problema o no . Non ho letto
i messaggi precedenti al tuo. Comunque ci sono riuscito. Mi è bastato Spy++
della Microsoft . Ho individuato l'handle della finestra in questione . Ho
filtrato i messaggi alla finestra impostando solo il WM_COMMAND ho clickato
sul menu in questione e ho letto i parametri del messaggio generato e da
Visual Basic ( per fare più veloce), ho richiamato la PostMessage con i
parametri necessari.
Il problema che mi si pone adesso, (scusate se mi permetto ) e come prendere
il testo da una casella testo della medesima applicazione ,sempre attraverso
PostMessage o altre funzioni.
Uno mi ha consigliato di utilizzare la funzione GetWindowText , che però in
base alla doc. MSDN non consente di ottenere il testo di un controllo , ma
solo della barra del titolo delle applicazioni.  Allora ho pensato di andare
sul bruto . Utilizzo direttamente il messaggio WM_GETTEXT utilizzato anche
dalla funzione.
Ho pensato di utilizzare il C++ . Ma fin quando utilizzo il WM_GETTEXT la
funzione non va mai a buon fine.
Ecco il listato:
#include "stdafx.h"
#include "windows.h"
#include <iostream.h>
int main()
{
char iArr[20];                                //  stringa che verrà riempita
WPARAM wparam = 21;          // massima lunghezza della stringa
HWND hWnd;                             // handle della finestra
long ocast = 3112;                      // handle al momento dell'esecuzione
char *ptn= iArr;                           // puntatore alla stringa non so
                                                      //   se serve a
LPARAM lparam;                       // qualcosa ma il compilatore mi
                                                     // segnala un errore se
nella funzione
                                                      // inserisco il
semplice nome della
                                                      // stringa
hWnd=(HWND)ocast;                 // ho dovuto fare così , almeno
                                                       // funziona col
WM_CLOSE
if (!PostMessage(hWnd,WM_GETTEXT,wparam,(long)ptn)){
cout << "Funzione fallita \n";
cout << "Handle o parametri non validi \n";
cout << "\n";
return(0);
}
else {
 for(int i; i=20; i++);
cout << iArr[i];
cout << "\n";
}
return(0);
}
Ho intuito dai comandi WM_GETTEXT generati quando minimizzavo l'applicazione
,che l' lparam richiede un puntatore a stringa , c'era infatti scritto . Ma
la funzione fallisce sempre . Come mai ? Forse non devo utilizzare
l'operatore di casting (long) nella funzione ma il parametro da passare è di
tipo long , se lo tolgo il compilatore mi genera un errore.
Aiutatemi vi prego .

Scusate il disturbo, problema risolto.
Grazie