Archive for the 'Source Code' Category

C++, Source Code, Windows

Intercettare tasti in c++

Per intercettare la pressione dei tasti in c++, è sufficente “agganciarsi” agli eventi del sistema operativo tramite il metodo SetWindowsHookEx delle API di windows:

HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);

Il parametro hook specifica a che tipo di eventi bisogna agganciarsi, il secondo parametro invece è il nome alla funzione da chiamare quando viene generato l’evento. Per ulteriori dettagli consultare la relativa voce su MSDN.

g_hKeyboardHook = SetWindowsHookEx (WH_KEYBOARD_LL,
	LowLevelKeyboardProc,
	hInstance, 0);

Nel nostro caso come hook settiamo la costante WH_KEYBOARD_LL per intercettare gli eventi generati dalla tastiera. Il metodo LowLevelKeyboardProc sarà quindi qualcosa del genere:

// hook per la tastiera
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
	// p->vkCode contiene il codice del tasto premuto

	if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
	{
		// è stato premuto il tasto
	}

	if ((nCode == HC_ACTION) && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
 	{
 		// è stato rilasciato il tasto
 	}

	return CallNextHookEx(0,nCode,wParam,lParam);
}

A cosa può servire?
Nel mio caso l’ho usato per registrare tutte le pressioni della tastiera e del mouse per salvare una macro con le azioni eseguite, per poi farle rieseguire con lo stesso tempismo da un altro programmino (per poter svolgere azioni ripetitive). Tra l’altro se a qualcuno interessa un programma del genere, e mi arrivano abbastanza feedback, mi sa che pubblicherò i sorgenti e i binari. :)
Un’altra idea interessantemalvagia è quella di costruire dei keylogger per salvare tutto ciò che l’utente scrive.

Download C++ Intercept keyboard events. Downloads: 53

C, Source Code, USBAutoStart

Prima versione di USB AutoStart

USB AutoStart

UsbAutoStart è un utility per Windows che permette di eseguire l’autoplay sulle penne usb o sui drive esterni. Windows per questioni di sicurezza infatti impedisce di eseguire l’autoplay negli hard disk rimovibili, ma attraverso questo programma si può bypassare questa impostazione e far sì che venga fatto partire un programma presente nella penna al collegamento di un hard disk esterno.
Inoltre, quando si cerca di rimuovere il dispositivo esterno con la “rimozione sicura dell’hardware”, il programma chiuderà tutti i programmi aperti nel computer che si trovano nella penna USB:

Screenshots:

Rilevamento del collegamento di una periferica usb:

Usb Autostart Periferica collegata

Opzioni di usb autostart:

Usb Autostart Opzioni

Il progetto è hostato su sourceforge, ed è rilasciato sotto la licenza GPL, quindi è completamente open source! :)

Download Usb Autostart

C, Source Code

Localizzazione di un progetto wx c++ (wx side)

Questo articolo presuppone la conoscenza di poEdit o di gettext trattati nel precedente articolo “Localizzazione di un progetto wx c++ (usare poEdit)”

wxWidgets

Aggiungere la localizzazione ad un programma scritto in wx è abbastanza semplice. Una volta ottenuti i files .po per tutti le lingue che vogliamo supportare, rinominiamoli con il nome della nostra applicazione e spostiamoli in subdirectory diverse per ogni linguaggio, esempio:

rootDelProgetto/locale/it
rootDelProgetto/locale/it_CH
rootDelProgetto/locale/en_US
rootDelProgetto/locale/en_GB

Continue Reading »

C, Source Code

Localizzazione di un progetto wx c++ (usando poEdit)

In questi giorni febbrili per il primo rilascio di UsbAutostarter, progettino lasciato in asso per un po’, ma che finalmente sta per vedere la luce, ho dedicato il mio pochissimo tempo libero alla localizzazione del programmino, per poterlo uppare su sourceforge. Purtroppo, per un “wxWidgets esordiente” come me, le cose non sono mai semplici sia per la scarsa documentazione online, sia per i pochissimi esempi di codice che si trovano in giro. Fortunatamente molti dei meravigliosi programmi scritti in wx sono open e sbirciando nel codice di amule, sono riuscito a capire come localizzare il progetto wx.

Logo poEdit

Innanzitutto dobbiamo predisporre all’internazionalizzazione i sorgenti del progetto: per distinguere le stringhe da localizzare con quelle che invece devono rimanere invariate, useremo la macro _(). Per es:

...
wxMessageBox( _("testo da localizzare") );
...
wxMessageBox( wxT("testo invariato") );

Continue Reading »

MySQL, Source Code, php

Nuova versione della classe MySQLDump per il backup di DB MySQL

Guest post di Daniele

Oggi vi presento la nuova versione (2.0) della classe MySQLDump già introdotta da questo articolo nel quale si spiega come utilizzare questo strumento per semplificare il backup di database MySQL mediante pagine php.

I miglioramenti non sono molto numerosi dato che si partiva dal già ottimo lavoro di inandrea ma penso possano rivelarsi abbastanza utili: ora è infatti possibile esportare struttura e/o dati non solo dell’intero database selezionato ma anche di una singola tabella.

Ipotizziamo di avere un database denominato ‘ilmiodatabase’ e, all’interno di questo la tabella ‘lamiatabella’. Ora vediamo come esportare struttura e dati per la nostra tabella. (Attenzione che l’interfaccia della classe è leggermente cambiata rispetto alla precedente versione).

//Includo la libreria
@include_once('lib_dump.php');
//Connessione al database
$connection = @mysql_connect('127.0.0.1','username','password');
//Creazione di una istanza della classe MySQLDump
//1° parametro: il nome del database da esportare
//2° parametro: il file che conterrà il dump
//3° parametro: il tipo di file creato (true = compresso, false = semplice)
//4° parametro: la codifica dei dati (true = esadecimale, false = plain text)
$dumper = new MySQLDump('ilmiodatabase','filedidump.sql',false,false);
//Espotazione della struttura della tabella 'lamiatabella'
$dumper->getTableStructure('lamiatabella');
//Espotazione dei dati contenuti nella tabella 'lamiatabella'
$dumper->getTableData('lamiatabella');

Continue Reading »

News, Source Code, Wiki-Dashboard, Wordpress, php

Wordpress Plugin: Wiki-Dashboard 0.1

Wiki-Dashboard è un plugin per Wordpress che permette di avere uno spazio condiviso tra tutti gli autori di un blog per potersi scambiare delle note a ‘mo di wiki, ma può risultare utile anche nei blog mono-autore, permettendo di avere una sorta di blocco note dove si possono prendere appunti.

Funzionalità del plugin:

  • Testo dove poter scrivere le note in una sottopagina della bacheca
  • Il testo è condiviso tra tutti gli autori del blog, e tutti possono modificarlo
  • Parser bbCode per la formattazione del testo
  • Supporto per l’internazionalizzazione

Screenshots:
Wiki-Dashboard mostra il testo:

Wiki-Dashboard View

Wiki-Dashboard durante l’editing del testo:
Wiki-Dashboard Edit
Continue Reading »

MySQL, Source Code, Web, php

Interfaccia alla classe MySQLDump per il backup

La classe MySQLDump è stata aggiornata a una nuova versione e questo articolo contiene informazioni obsolete. Per informazioni sulla nuova versione controllare l’articolo sulla nuova versione

Dopo il successo dell’articolo Backup di un database mysql da php, ho deciso di scrivere un piccolo post su un file che può ritornare utile per scaricare il backup del db di un sito o di un blog wordpress direttamente dal browser.
Per usare lo script, basta semplicemente scaricarlo e modificare le prime linee, dove è contenuta la configurazione:

// Configurazione del DB
$server = "IP del server (localhost dovrebbe andare bene nella maggior parte dei casi=";
$username = "Nome utente del db";
$password = "Password del db";
$dbToDump = "Nome del db di cui fare il dump";
// password per accedere alla pagina php. Ricordati di cambiare la password di default!!!
$backupPassword = "UltraSecretKeyThatYouMUSTInsertHere";
// nome del file in cui salvare il backup
$filename = "backup.sql.gz";

Dopo ciò, si può uploadare il file nel server, nella stessa cartella dove è presente la classe MySQLDump.
Per accedere allo script bisogna specificare due parametri: la password per accedere allo script (pass), e un altro parametro (t) che se è 1 separerà le SQL insert ogni 100 righe.
Per esempio, se si è uploadato il file nella directory principale del sito, basta scrivere nella barra degli indirizzi del browser:

http://www.iltuosito.it/backup.php?pass=UltraSecretKeyThatYouMUSTInsertHere&t=1

…e il browser aprirà la finestra di dialogo per scaricare il file con il backup del db!

Download MySqlDump Interface.php. Downloads: 415

Per ulteriori informazioni sulla classe MySQLDump, leggere l’articolo originale, o scaricare il sorgente da qui:

Download MySQLDump. Downloads: 1938

C, Source Code

Stringa auto-dimensionante in c

In questo articolo spiegherò come creare una struttura con relative funzioni associate per permettere di utilizzare una stringa che incrementi la sua dimensione appena lo spazio allocato non basta più per conservare i caratteri, utilizzando soltanto le caratteristiche del linguaggio c (niente classi quindi).
Una stringa del genere è molto utile nei casi dobbiamo lavorare con stringhe di cui non si conosce a priori la lunghezza (per es. una stringa letta da un file xml): possiamo quindi leggere i caratteri ad uno ad uno fino a quando non arriviamo alla fine della stringa, senza preoccuparci dell’allocazione della memoria.
Innanzitutto analizziamo la struttura dati che definisce la stringa autoincrementante:

// Struct containing the growing string
typedef struct
{
	// stringa
	char * text;
	// lunghezza della stringa (comprensiva dello zero terminatore)
	int length;
	// capacità della stringa
	int capacity;
} growing_string;

La variabile text sarà il posto dove effettivamente andremo ad allocare la stringa, length indicherà la lunghezza della stringa corrente mentre capacity la memoria allocata per la stringa.
Per capire meglio la differenza tra length e capacity guardiamo la prossima immagine:

Capacity-Length

Capacity rappresenta quindi lo spazio allocato in memoria per la stringa, mentre length rappresenta il numero di caratteri effettivamente occupati (comprensivo di zero terminatore). Si capisce facilmente che se si aggiungono abbastastanza caratteri da fare in modo che length sia maggiore di capacity, allora bisogna riallocare lo spazio di memoria in modo da far entrare più caratteri.
Continue Reading »

C, Source Code, Windows

Spegnere o riavviare il pc

Piccolo post per una funzione che spegne o riavvia il pc su Windows in c++.
La funzione viene chiamata con il parametro false se si vuole spegnere il pc, con true se invece si vuole riavviare, e ritorna false nel caso in cui per qualche motivo la procedura di spegnimento non sia andata in porto (per es. qualche processo ha negato lo shutdown).

Shut Down

Per spegnere il pc basta quindi invocare la funzione nel seguente modo:

if (!ShutDown(false))
{
	// spegnimento non riuscito
}

Parte del codice sorgente è di seguito:
Continue Reading »

C, Source Code

Modificare gli elementi di un form da un thread

Scenario:
Si vuole eseguire al clic di un certo elemento di un Form un’operazione abbastanza lunga, come per esempio lo scaricamento di alcuni files da internet, ma durante l’operazione l’utente deve poter avere il controllo del programma e avere un feedback visivo della percentuale di completamento dell’operazione.
Soluzione non funzionante:
Ci si rende conto subito che per risolvere un problema del genere è necessario utilizzare un Thread che esegua l’operazione in un contesto separato da quello del Form principale, altrimenti il programma si bloccherà in attesa della fine dell’operazione senza possibilità di ricevere input dall’utente. Il vero problema adesso si crea quando si cerca di aggiornare i componenti del Form dal Thread:

private void button1_Click(object sender, EventArgs e)
{
    testThread = new Thread(threadProc);
    testThread.Start();
}

public void threadProc()
{
    // wast a lot of time...
    for (int i = 1; i <= 10; i++)
    {
        Thread.Sleep(250);
        progressBar.Value = i * 10;
    }
    MessageBox.Show("Operation Completed!");
}

Purtroppo, all’esecuzione della riga di codice dove viene assegnato il valore alla progressBar si otterrà un messaggio di errore simile al seguente:
“Operazione cross-thread non valida: è stato eseguito l’accesso al controllo ‘progressBar1′ da un thread diverso da quello da cui è stata eseguita la creazione.”

lock

Continue Reading »

Next »