sabato 3 febbraio 2024

Compilare un form di inserimento dati programmaticamente da un altra applicazione usando .Net P/Invoke con la dll user32

Questo post è solo un ""PoC"" (Proof of Concept) :

potrebbe presentarsi in uno scenario ipotetico la necessità di caricare dei dati in un applicazione windows di cui non abbiamo i sorgenti ne accesso al database ne funzioni di importazione dati,una soluzione potrebbe essere utilizzare l'API user32 per caricare programmaticamente i dati (che arrivano da un file excel,xml,json,testo,db,web service, etc.etc.) tramite i form dell'applicazione. Per trovare gli indirizzi dei textbox che vogliamo compilare possiamo utilizzare Winspector  :

Una volta trovata la text box da compilare possiamo valorizzarla da un altra applicazione:

        using System;
using System.Runtime.InteropServices;

        namespace TestWindow
       {
            public partial class Form1 : Form
           {

              [DllImport("user32.dll", CharSet = CharSet.Unicode)]
              private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

              [DllImport("user32.dll")]
              static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

              const int WM_SETTEXT = 0X000C;              

              private void SendMessageToTextBox(IntPtr ptr,string testo)
             {
                    SendMessage(ptr, WM_SETTEXT, 0, testo);
             }

              private void Form1_Load(object sender, EventArgs e)
             {
                   this.CompileForm();
             }            

             private void CompileForm()
             {
                 IntPtr p1 = new IntPtr(0x0020059A);
                 this.SendMessageToTextBox(p1, "textboxuno");
             } 
         }
      }

     


Modificando il metodo CompileForm compiliamo le due textbox:

private void CompileForm()
        {
            IntPtr p1 = new IntPtr(0x0020059A);
            this.SendMessageToTextBox(p1, "textboxuno");
            IntPtr p2 = new IntPtr(0x0043060E);
            this.SendMessageToTextBox(p2, "textboxdue");           
        }

ed otteniamo :


a scopo dimostrativo dell'effettiva chiamata dell'evento click dell'altra applicazione aggiungiamo del codice nel gestore dell'evento click del bottone "button1" :

         private void button1_Click(object sender, EventArgs e)
        {
            string s = this.textBox1.Text;
            string w = this.textBox2.Text;
            this.textBox3.Text = this.textBox3.Text + s + Environment.NewLine;
            this.textBox3.Text=this.textBox3.Text + w + Environment.NewLine;           
        }


aggiungiamo al metodo CompileForm dell'applicazione "chiamante" il SendMessage all'evento click :

        private void CompileForm()
        {
            IntPtr p1 = new IntPtr(0x0020059A);
            this.SendMessageToTextBox(p1, "textboxuno");
            IntPtr p2 = new IntPtr(0x0043060E);
            this.SendMessageToTextBox(p2, "textboxdue");                       
            IntPtr p3 = new IntPtr(0x003F079E);
            const int BM_CLICK = 0x00F5;
            SendMessage(p3, BM_CLICK,IntPtr.Zero,IntPtr.Zero);
        }

chiamiamo il metodo CompileForm ed otteniamo :
   





Crittografia e WCF per passare una password ( od una qualsiasi altra stringa (xml,json, etc.etc.) ) da un applicazione ad un' altra in sicurezza

 Il codice che segue è da considerarsi in alpha e da non utilizzare in un ambiente di produzione , qui potete trovare il  "progetto...