Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197

    [vb.net/vb.6] Inversione maiuscole/minuscole su testo digitato "OVUNQUE"

    [linguaggio da utilizzare: vb.net o vb6]

    vorrei realizzare un programmino che attraverso una una combinazone di tasti da me scelta ("ctrl+qualche tasto") inverta le minuscole in maiuscole e viceversa di un testo che ho digitato in qualunque programma, editor, o casella di testo nel quale abbia scritto tale testo.
    Presumo quindi che il lavoro vada fatto a livello di windows.

    faccio qualche esempio:

    scrivo su notepad: "Io sono Alessio" -->seleziono il testo appena scritto -->premo la combinazione di tasti scelta -->il programma cambia il mio testo in: "iO SONO aLESSIO"


    altro esempio:
    sto su all'interno del Explorer e scrivo su una casella di testo di una pagina web "PASSword" -->premo la combinazione di tasti scelta -->il programma cambia il mio testo in "passWORD"


    ora a parte il semplice codice che inverte le minuscole in maiuscole, quello di cui avrei bisogno è un aiuto su come procedere per catturare il testo selezionato in qualsiasi applicazione(attenzione:testo solo selezionato, non copiato! lo evidenzio con il mouse ma non faccio ctrl+c) presumo quindi che dovro' usare un'API di windows(a meno che esista qualche classe.net), quale?
    Che tipo di programma dovra essere? un servizio di windows? un semplice eseguibile da laciare all'avvio?altro?
    e inoltre come riscrivere il testo modificato nella stessa selezione da cui o catturato il testo?


    spero di esssermi spiegato bene e che qualcuno possa darmi dei suggerimenti, grazie a tutti

  2. #2
    In primo luogo devi ottenere l'handle alla finestra che ha il focus, cosa non immediata dal momento che tale finestra apparterrà sicuramente ad un altro thread.
    codice:
    //Restituisce la finestra che ha correntemente il focus
    HWND GetFocusEx()
    {
        GUITHREADINFO gti={0};
        if(!GetGUIThreadInfo(GetWindowThreadProcessId(GetForegroundWindow(),NULL),&gti))
            return NULL;
        return gti.hwndFocus;
    }
    Prima di ottenere il testo selezionato, bisogna assicurarsi che si tratti di una casella di testo standard.
    codice:
    bool IsStandardTextBox(HWND hWnd)
    {
        TCHAR buffer[64];
        if(!GetClassName(hWnd,buffer,sizeof(buffer)))
            return false;
        return (_tcscmp(buffer,_T("Edit"))==0)||(_tcsstr(buffer,_T("RICHEDIT"))==buffer);
    }
    Quindi se ne potrà ottenere il contenuto e prendere solo la selezione con i messaggi WM_GETTEXT e EM_GETSEL (in questo stralcio di codice c'è anche la chiamata delle subroutine che ho appena mostrato; questa funzione verrebbe richiamata non appena viene intercettata la pressione di tasti).
    codice:
    bool InvertFocusedWndSelText() //I nomi delle funzioni non sono il mio forte...
    {
        HWND focusWnd;
        TCHAR * buffer;
        DWORD firstPos, lastPos;
        unsigned int charNum;
        //Ottiene l'handle della finestra con il focus
        if((focusWnd=GetFocusEx())==NULL)
            return false;
        //Verifica se si tratta di una textbox standard
        if(!IsStandardTextBox(focusWnd))
            return false;
        //Ottiene i limiti della selezione
        SendMessage(focusWnd,EM_GETSEL,&firstPos,&lastPos);
        if(lastPos-firstPos==0)
            return false; //non c'è alcuna selezione
        //Ottiene il numero di caratteri totali
        charNum=(unsigned int)SendMessage(focusWnd,WM_GETTEXTLENGTH,0,0);
        if(charNum==0)
            return false;
        //Alloca la memoria necessaria
        //TODO: aggiungere controllo allocazione fallita o delegarlo al chiamante
        buffer=new TCHAR[charNum+1];
        //Ottiene la stringa contenuta nella textbox
        if(SendMessage(focusWnd,WM_GETTEXT,charNum+1,buffer)==0)
        {
            delete [] buffer;
            return false;
        }
        //Inverte il case
        for(TCHAR * cchar=(buffer+firstPos);cchar<(buffer+lastPos);cchar++)
        {
            if(_istlower(*cchar))
                *cchar=_totupper(*cchar);
            else if(_istupper(*cchar))
                *cchar=_totlower(*cchar);
        }
        //Rimette la stringa modificata nella textbox
        if(!SendMessage(focusWnd,WM_SETTEXT,0,buffer))
        {
            delete [] buffer;
            return false;
        }
        //Dealloca
        delete [] buffer;
        //Ok!
        return true;
    }
    Quanto all'impostazione degli hotkey, ti rimando alla documentazione della funzione RegisterHotKey.

    Questo approccio funziona solo con le textbox standard (ad esempio in un documento di Word non funzionerà).
    Tra parentesi, non ho collaudato questo codice, per cui non ti garantisco niente.
    ---EDIT---
    Vedo solo ora che la richiesta era per VB.NET/VB6... Be', comunque le API da usare sono sempre quelle.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197
    Originariamente inviato da MItaly
    .....
    Vedo solo ora che la richiesta era per VB.NET/VB6... Be', comunque le API da usare sono sempre quelle.
    va benissimo uguale, è uno spunto utile,
    faccio delle prove thanks

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.