Oppure

Loading
02/12/12 10:54
xprogrammerx
Salve a tutti, già da un po', ho cominciato a studiare VB.NET ed a creare qualche applicazione.

Quella che stavo cercando di creare oggi, consiste nel controllare un preciso colore da me scelto in una precisa coordinata dello schermo sempre da me scelta, e di dare in output per esempio in una msgbox, "Yes" se corrisponde, o "No con eventuali differenti valori in caso contrario".
Ho cercato qualcosa senza successo, premetto che non sono ancora pratico con l'utilizzo delle API.

Una seconda cosa di cui avrei bisogno, sarebbe di tenere un tasto della testiera, o del mouse premuto.
Per esempio la barra spaziatrice.
Non ho trovato un comando simile, se non metodi che utilizzano alcune istruzioni in modo particolare, ad esempio con intervalli 0, per far si che questo accada, ma non sono certo che sia la soluzione migliore.

Se qualcuno più esperto potrebbe darmi una mano, ne sarei molto grato.
aaa
02/12/12 11:26
Poggi Marco
Ciao!

Per il controllo del colore, utilizza la classe drawing: msdn.microsoft.com/it-it/library/….

Mentre per intercettare la pressione della barra spaziatrice, usa l' evento keypressed.
Ultima modifica effettuata da Poggi Marco 02/12/12 13:20
aaa
03/12/12 1:27
Thejuster
Ho tirato giù qualcosa ma puoi sicuramente migliorarlo.


 bool cerca = false;
        private const int KEY_PRESSED = 0x8000;
        //In vb.net equivale a &H8000

        enum VirtualKeyStates : int
        {

            VK_F10 = 0x79 // F10 in vb.net dovrebbe essere &H79

        }


        [DllImport("user32.dll")]
        static extern IntPtr GetDC(IntPtr hwnd);

        [DllImport("user32.dll")]
        static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);

        [DllImport("gdi32.dll")]
        static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);

        [DllImport("user32.dll")]
        static extern short GetKeyState(VirtualKeyStates nVirtKey);


        static public System.Drawing.Color GetPixelColor(int x, int y)
        {
            IntPtr hdc = GetDC(IntPtr.Zero);
            uint pixel = GetPixel(hdc, x, y);
            ReleaseDC(IntPtr.Zero, hdc);
            Color color = Color.FromArgb((int)(pixel & 0x000000FF),
                         (int)(pixel & 0x0000FF00) >> 8,
                         (int)(pixel & 0x00FF0000) >> 16);
            return color;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            if (cerca == true)
            {
                if (Convert.ToBoolean(GetKeyState(VirtualKeyStates.VK_F10)))
                {
                      IntPtr hdc = GetDC(IntPtr.Zero);
                      uint pixel = GetPixel(hdc, Cursor.Position.X, Cursor.Position.Y);
                      ReleaseDC(IntPtr.Zero, hdc);
                      Color color = Color.FromArgb((int)pixel);

                      MessageBox.Show("Colore relativo alle coordinate: " + color);
                      cerca = false;
                }
            }
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            cerca = true;
        }





ho fatto in modo che premendo il tasto F10
ti avvia un timer che esegue un check fin quando non premi il tasto F10.
una volta premuto ti và a cercare le coordinate dello schermo e ti restituisce il colore.

puoi cambiare o decidere le cordinate che vuoi qui


uint pixel = GetPixel(hdc, Cursor.Position.X, Cursor.Position.Y);

è un pò come usare il graphics tipo

Color pixel = immagine.GetPixe(x,y,)

solo che per farlo su schermo hai bisogno di interrogare le winapi.

Oppure altro sistema più semplice.
Puoi effettuare una screenshoot del monitor, ed usare l'immagine nella picture box.
e fare lo stesso procedimento utilizzando il graphics e così risparmierai molto più tempo.

PS:
Putroppo odio il vb.net
prova a convertire il codice qui

developerfusion.com/tools/convert/csharp-to-vb/


mire.forumfree.it/ - Mire Engine
C# UI Designer