Tips&Tricks I trucchi del mestiere

 

Nascondere il testo rendendolo illeggibile


Si tratta di una piccola implementazione di un algoritmo per nascondere del testo in chiaro e renderlo illeggibile, almeno per un po' di tempo. Si basa sullo scambio di posizione e di carattere in modo variabile. La fase di crittazione richiede di inserire il nome del file di testo da trasformare, che dovrα essere presente nella cartella dell'eseguibile, e lo trasforma in "crypted.dat". La fase di decrittazione, invece, carica automaticamente tale file ("crypted.dat"), che sarα presente nella cartella dell'eseguibile, e lo trasforma in un file di testo il cui nome viene richiesto in fase di elaborazione.
Tip fornito dal sig. C.Calabr≥

#include 
#include 
#include 

 char filename[255];
 string buffer1, buffer2;
 int n_lettere, scelta;

 fstream orig;
 fstream dest;

 void crypto(), decrypto();

void main()
{

 cout<<"Benveuto in Crypto, di Cristiano Calabro'"<<endl;
 cout<<"Vuoi: \t1 => criptare \n\t2 => decriptare"<<endl;
 cout<<"\n\tScelta => ";
 cin>>scelta;

 switch(scelta)
 {
  case 1:
   crypto(); break;

  case 2:
   decrypto(); break;
  }

 system("PAUSE");
}

void crypto()
{
  cout<<"\n\nInserisci il nome del file da aprire (comprensivo di estensione) => ";
  cout<<"\n\tNome del file => ";
  cin>>filename;

  orig.open(filename, ios::in);
  dest.open("crypted.dat", ios::out);

  if (!orig)
    cout<<"Errore nell'apertura del file"<<endl;
   else
   {
    orig.seekg(ios::beg); //posiziono il puntatore all'inizio del file
    while(!orig.eof())
    {
    orig>>buffer1; //carico in buffer la prima parola  n_lettere=buffer1.size(); //n_lettere Θ un intero che contiene la quantitα di lettere della parola
    n_lettere=buffer1.size(); //n_lettere Θ un intero che contiene la quantitα di lettere della parola

  /* Segue il cuore del prgramma */
     for (int i=n_lettere-1; i>=0; i--) //mi muovo di carattere in carattere a ritroso
     {
      buffer2[(n_lettere-1)-i]=buffer1[i]+n_lettere; //Scrivo in buffer2 il caratteri traslati di n_lettere e ruotati di n_lettere_posizioni
      dest<<buffer2[(n_lettere-1)-i];
     }
     dest<<" ";
    };
/* Termine del cuore del programma */
   cout<<"File criptato con successo!"<<endl;
   }
 orig.close();
 dest.close();
}

void decrypto()
{
  orig.open("crypted.dat", ios::in);
  cout<<"Inserisci il nome del file sul quale scrivere (sara' di tipo tuonome.txt) => ";
  cout<<"\n\tNome del file => ";
  cin>>filename;
  strcat(filename,".txt");

  dest.open(filename, ios::out);

  if (!orig)
    cout<<"Errore nell'apertura del file"<<endl;
    else
    {
    orig.seekg(ios::beg); //posiziono il puntatore all'inizio del file
     do
     {
     orig>>buffer1; //carico in buffer la prima parola  n_lettere=buffer1.size(); //n_lettere Θ un intero che contiene la quantitα di lettere della parola
     n_lettere=buffer1.size(); //n_lettere Θ un intero che contiene la quantitα di lettere della parola

  /* Segue il cuore del prgramma */
     for (int i=n_lettere-1; i>=0; i--) //mi muovo di carattere in carattere a ritroso
     {
      buffer2[(n_lettere-1)-i]=buffer1[i]-n_lettere; //Scrivo in buffer2 il caratteri traslati di n_lettere e ruotati di n_lettere_posizioni
      dest<<buffer2[(n_lettere-1)-i];
     }
     dest<<" ";
     }while(!orig.eof());
/* Termine del cuore del programma */
   cout<<"File decriptato con successo!"<<endl;
   }
 orig.close();
 dest.close();
}



Alleggeriamo i file JPEG


A volte si rende necessario rendere pi∙ leggeri, in termini di byte, le nostro foto in formato JPEG, ma il ridimensionamento non Φ l'unica via da seguire. La routine proposta consente di ricomprime l'immagine fino a raggiungere le dimensioni desiderate. Prima di scrivere la routine ricordiamo di includere la unit Jpeg.
Tip fornito dal sig. F. Iaccarino


uses Jpeg; function RecompressImage(FileJPEG: string; maxSize, inc: integer): boolean; var MyJPEG: TJPEGImage; MyBMP: TBitmap; i,s: integer; begin result:=False; i:=100; MyJPEG:=TJPEGImage.Create; try MyJPEG.LoadFromFile(FileJPEG); repeat MyBMP:=TBitmap.Create; try MyBMP.Height:=MyJPEG.Height; MyBMP.Width:=MyJPEG.Width; MyBMP.Canvas.Draw(0,0,MyJPEG); MyJPEG.Assign(MyBMP); dec(i,inc); if i<=0 then exit; MyJPEG.CompressionQuality:=i; MyJPEG.Compress; MyJPEG.SaveToFile(FileJPEG+'r'); s:=GetFileSize(FileJPEG+'r');//,nil); finally MyBMP.Free; end; until (s<MaxSize); finally MyJPEG.Free; end; DeleteFile(FileJPEG); MoveFile(PChar(FileJPEG+'r'),PChar(FileJPEG)); result:=True; end;

Di seguito un esempio di utilizzo della funzione:

// Ridimensiona il file indicato in un Edit ad un valore <= a 512Kb
//utilizzando degli step di incremento di compressione di 5 punti.


if not RecompressImage(ImageFile.Text,512*1024,5) then ShowMessage('Impossibile ridurre la dimensione dell'immagine');



Enumerare le chiavi del registro di sistema


Il tip consente di enumerare tutte le chiavi di registro modificate in un determinato intervallo di tempo. E' utile per vedere le modifiche effettuate sul registro di Windows da programmi installati (eventuale spyware allegato a software p2p, etc...) Il codice, data la sua prolissitα, Φ presente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it)
Tip fornito dal sig. C. Pasolini



Comunicazione seriale e parallela


Un trucco per aprire, e mettersi in ascolto, su una porta seriale o parallela in Java. NellÆesempio viene mostrato un esempio che utilizza la porta seriale COM1.
Per questa operazione Φ necessario: scaricare il package Java Communication API (javax.com) http://java.sun.com/products/javacomm/index.html e copiare: win32com.dll in \bin, comm.jar in \lib, javax.comm.properties in \lib e in \jre\lib. Infine aggiungere comm.jar nel classpath: set CLASSPATH=c:\jdk1.1.6\lib\comm.jar;%classpath%.
Il codice Φ presente in formato sorgente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it) Tip fornito dal sig. P.Orsini

import java.io.*;
import javax.comm.*;
import java.util.*;

public class Com implements Runnable,SerialPortEventListener{	
	
	//Dichiarazioni variabili
	static CommPortIdentifier portId;
    static Enumeration portList;
	  
    SerialPort serialPort;
    Thread readThread;	
    private InputStream serialInput;	
		
	public static void main(String[] arg) throws Exception{	
		
		//Richiede la lista delle porte disponibili
		portList=CommPortIdentifier.getPortIdentifiers();
			
		// Cerca fra le porte disponibili quella richiesta
		//finchΦ c'Φ ancora una porta nella lista
		while (portList.hasMoreElements()){
			
			//Prende un porta dalla lista
			portId=(CommPortIdentifier) portList.nextElement();
        	
        	// Controlla che la porta presa in considerazione sia
        	//una porta seriale ed in particolare la COM1
        	// Per le porte parallele utilizzare:
        	//CommPortIdentifier.PORT_PARALLEL
        	if ((portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
        	    && (portId.getName().equals("COM1"))){
        		
        	    System.out.println("Porta trovata");
        		
        		new Com();
        		break;			
        	}
         }
	    } 	
   
	    
	  public Com() throws Exception{
	  	
	  	//Apre la porta con un timeout di 2sec (2000 msec)
	  	serialPort=(SerialPort) portId.open("RS232",2000);
     	
     	//Associa un evento all'input dalla porta
     	serialPort.addEventListener(this);
     	serialPort.notifyOnDataAvailable(true);
     	
     	//Setta i parametri della porta
     	serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
		serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
		
		//Apre un canale di comunicazione
		serialInput=serialPort.getInputStream();
     	
     	System.out.println("Porta aperta");
     	
     	//Avvia il thread per l'ascolto
     	readThread = new Thread(this);
        readThread.start();
         
     }
     
     //Thread in ascolto sulla tastiera
     public void run(){
     	
     	try{
     		
     		BufferedReader tastiera=new BufferedReader(new 
     		InputStreamReader(System.in));
     	
     		//Attesa comando quit
     		while (!(tastiera.readLine().equals("quit")));
     		
     		//Chiusura porta 
     		serialPort.close();
     	}
     	catch (Exception e){
     		 	System.out.println(e);}
     }
     	
     	
     public void serialEvent(SerialPortEvent event){
     	
     	//Verifica la presenza di dati nel buffer
     	if (event.getEventType()==SerialPortEvent.DATA_AVAILABLE){
     	
     		try{
     			//Legge i dati dal buffer (se presenti)
     			while(serialInput.available()>0) 
     			      System.out.print((char)serialInput.read()); 								
     		} 
     		catch (Exception e){
     			System.out.println(e);
	  		}
     	}
     }
}



Da componente a JPEG


Attraverso poche righe di codice Φ possibile salvare un nostro componente come immagine JPEG. Il codice Φ presente in formato sorgente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it)
Tip fornito dal sig. M.Rapa


import java.io.OutputStream; import java.io.FileOutputStream; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; import java.awt.Component; import java.awt.image.BufferedImage; import java.awt.Dimension; import java.awt.Graphics2D; public class ComponentToJPEG { /** * * @param myComponent * @param filename */ public static void saveComponentAsJPEG(Component myComponent, String filename) { Dimension size = myComponent.getSize(); BufferedImage myImage =new BufferedImage(size.width, size.height,BufferedImage.TYPE_INT_RGB); Graphics2D g2 = myImage.createGraphics(); myComponent.paint(g2); try { OutputStream out = new FileOutputStream(filename); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(myImage); out.close(); } catch (Exception e) { System.out.println(e); } } }



Come estrarre le icone da file .exe o da librerie di icone .icl


Il codice utilizza delle API di sistema, in particolare ExtractIcon e DrawIcon per estrarre e visualizzare l'icona in una finestra di about standard di Windows.
Tip fornito dal sig. S.Tomaselli


Private Declare Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long Private Declare Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As String, ByVal szOtherStuff As String, ByVal hIcon As Long) As Long Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long, ByVal hIcon As Long) As Long Private Function Estrai(ByVal NomeFile As String, Index As Long) As Long Estrai = ExtractIcon(0, NomeFile, Index) End Function Private Sub Form_Click() 'Cambiare questa costante se il percorso Φ diverso. 'In ogni caso indica solamente il file da cui estrarre le icone 'che pu≥ essere qualsiasi .exe per windows e qualsiasi file .icl Const explorer = "c:\windows\explorer.exe" Dim Icona As Long 'Variabile in cui viene inserito il numero handle dell'icona estratta 'L'indice dell'icona pu≥ essere cambiato, i valori partono da 0 Icona = Estrai(explorer, 5) DrawIcon Me.hdc, 0, 0, Icona 'Disegna l'icona sul form ShellAbout Me.hwnd, "NomeProgramma", "", Icona 'Apre la finestra di about End Sub



Generazione di una sequenza casuale di n numeri interi tutti distinti


La funzione proposta genera n numeri interi casuali tutti distinti, compresi tra min e max. Si vuole evitare di doverli generare uno alla volta, per evitare di dover fare, per ciascuno di essi, un ciclo di tentativi.
Tip. Fornito dal sig. R.Bandiera

Private Function SequenzaCasuale(ByVal n As Integer, ByVal min As Integer, ByVal max As Integer) As Integer()
' n Θ il numero di valori desiderati
' min e max sono gli estremi del campo di variazione 
' dei valori desiderati

Dim numero() As Integer
Dim i As Integer
Dim j As Integer
Dim appo As Integer

' generazione dei numeri interi da min a max
ReDim numero(1 To max - min + 1)
For i = 1 To max - min + 1
   numero(i) = i + min - 1
Next i
Randomize

' ciclo di mescolamento
For i = 1 To max - min + 1
  j = Int(Rnd() * (max - min + 1)) + 1
  ' scambio tra numero(i) e numero(j)
  appo = numero(i)
  numero(i) = numero(j)
  numero(j) = appo
Next i

' una seconda rimescolata
For i = 1 To max - min + 1
  j = Int(Rnd() * (max - min + 1)) + 1
  ' scambio tra numero(i) e numero(j)
  appo = numero(i)
  numero(i) = numero(j)
  numero(j) = appo
Next i

' restituzione delle prime n componenti
ReDim Preserve numero(1 To n)
SequenzaCasuale = numero()
End Function


Registrare le operazioni compiute col mouse


Il tip utilizza una ocx per registrare i movimenti ed i tasti premuti del mouse; una tale applicazione potrebbe risultare utile in tutte quelle situazioni in cui si rende necessario mostrare, automaticamente, le funzionalitα di un programma. Il codice, data la sua prolissitα, Φ presente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it) .
Tip fornito dal sig. P.Miola


Richiamare query da DB Access tramite selezione da una combobox


Il codice da me permette di richiamare da Visual Basic delle query contenute in un database Access e di visualizzarle in una tabella in base alla selezione effettuata dall'utente mediante combobox. L'utente selezionerα la voce di suo interesse dalla combobox e premendo il pulsante cerca verrα richiamata la query contenuta nel database Access "Listino".
Questo database contiene diverse query, ognuna delle quali Φ collegata alle voci della combobox.
Il codice Φ presente in formato sorgente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it)
Tip fornito dal sig. S.Giolo


Private Sub Command1_Click()
Opzione
End Sub

Private Sub Opzione()
If Combo1.Text = "Monitors" Then
Ado.RecordSource = "Monitor"
Set Flex.DataSource = Ado
Ado.Refresh
Else
If Combo1.Text = "Stampanti" Then
Ado.RecordSource = "Stampanti"
Set Flex.DataSource = Ado
Ado.Refresh
Else
If Combo1.Text = "Scanner" Then
Ado.RecordSource = "Scanner"
Set Flex.DataSource = Ado
Ado.Refresh
Else
End If
End If
End If
End Sub

Private Sub Form_Load()
Ado.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & 
"\listino.mdb"
Combo1.AddItem "Stampanti"
Combo1.AddItem "Scanner"
Combo1.AddItem "Monitors"
Combo1.ListIndex = 0
End Sub


Una finestra ômagneticaö


Il tip produce un effetto ômagneticoö, delle finestre durante le operazioni di spostamento delle stesse; un poÆ come avviene similarmente nellÆambiente KDE di Linux. Per ammirare l'effetto magnetico bisogna attiva l'opzione Mostra contenuto della finestra durante l'operazione di trascinamento - dal pannello delle proprietα dello schermo, nella scheda Effetti.
Il codice Φ presente in formato sorgente nel cd-rom allegato alla rivista e/o sul sito web di ioProgrammo (www.ioprogrammo.it)
Tip fornito dal sig. L.La Marca


Public Const GWL_WNDPROC = (-4)
Public Const WM_MOVE = &H3


Public Const ABE_BOTTOM = 3
Public Const ABE_LEFT = 0
Public Const ABE_RIGHT = 2
Public Const ABE_TOP = 1

Public Const ABM_GETTASKBARPOS = &H5


Public Const SWP_NOSIZE = &H1

Public Const SWP_NOZORDER = &H4

Public Const SWP_NOSENDCHANGING = &H400


Public Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Public Type APPBARDATA
    cbSize As Long
    hwnd As Long
    uCallbackMessage As Long
    uEdge As Long
    rc As RECT
    lParam As Long
End Type

Public Declare Function SHAppBarMessage Lib "shell32.dll" (ByVal dwMessage As Long, pData As APPBARDATA) As Long

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public trayBar As APPBARDATA
Public lProcOld As Long
Public appRect As RECT, deskRect As RECT

Public Const margine = 20   ' n. di pixel di margine

' Subclassing per la gestione dell'evento WM_MOVE generato durante gli spostamenti del form
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    Dim w As Long, h As Long
    Dim move As Boolean
    
     If uMsg = WM_MOVE Then
        
        If (GetWindowRect(hwnd, appRect)) Then
            w = appRect.Right - appRect.Left
            h = appRect.Bottom - appRect.Top

            If Not (w < deskRect.Right) And Not (h < deskRect.Bottom) Then
                Exit Function
            End If
            move = False
            If (Abs(appRect.Top - deskRect.Top) <= margine) Then
                appRect.Top = deskRect.Top
                move = True
            End If
            If (Abs(appRect.Left - deskRect.Left) <= margine) Then
                appRect.Left = deskRect.Left
                move = True
            End If
            If (Abs(appRect.Bottom - deskRect.Bottom) <= margine) Then
                appRect.Top = deskRect.Bottom - h
                move = True
            End If
            If (Abs(appRect.Right - deskRect.Right) <= margine) Then
                appRect.Left = deskRect.Right - w
                move = True
            End If
            If move Then
                SetWindowPos hwnd, 0, appRect.Left, appRect.Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER 'Or SWP_NOSENDCHANGING
            End If
        Else
            Debug.Print GetLastError()
        End If
     End If
     WindowProc = CallWindowProc(lProcOld, hwnd, uMsg, wParam, lParam)
 
 End Function


Public Function GetDesktopRect(ByRef lpRect As RECT) As Long

    Dim sz As RECT
    Dim ret As Long
         
    trayBar.cbSize = Len(trayBar)
    trayBar.hwnd = FindWindow("Shell_TrayWnd", 0)
    
    ' calcola le dim. e la posizione della barra degli strumenti
    ret = SHAppBarMessage(ABM_GETTASKBARPOS, trayBar)
    sz = trayBar.rc
        
    ' calcola le dim. dello schermo
    GetWindowRect GetDesktopWindow(), lpRect

    ' calcola le dim. effettive del desktop
    Select Case trayBar.uEdge
    Case ABE_TOP
        lpRect.Top = sz.Bottom
    Case ABE_LEFT
        lpRect.Left = sz.Right
    Case ABE_RIGHT
        lpRect.Right = sz.Left
    Case ABE_BOTTOM
        lpRect.Bottom = sz.Top
    End Select
        
End Function

Uso :

...

Private Sub Form_Load()
    
    GetDesktopRect deskRect
    lProcOld = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    
End Sub
Private Sub Form_Unload(Cancel As Integer)  
    SetWindowLong Me.hwnd, GWL_WNDPROC, lProcOld
End Sub
...