Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Controllo Colore In Coordinata X,Y
Forum - C# / VB.NET - [VB.NET] Controllo Colore In Coordinata X,Y

Avatar
xprogrammerx (Normal User)
Newbie


Messaggi: 1
Iscritto: 02/12/2012

Segnala al moderatore
Postato alle 11:54
Domenica, 02/12/2012
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.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 951
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 12:26
Domenica, 02/12/2012
Ciao!

Per il controllo del colore, utilizza la classe drawing: http://msdn.microsoft.com/it-it/library/system.windows.med ....

Mentre per intercettare la pressione della barra spaziatrice, usa l' evento keypressed.

Ultima modifica effettuata da Poggi Marco il 02/12/2012 alle 14:20


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 2:27
Lunedì, 03/12/2012
Ho tirato giù qualcosa ma puoi sicuramente migliorarlo.

Codice sorgente - presumibilmente C#

  1. bool cerca = false;
  2.         private const int KEY_PRESSED = 0x8000;
  3.         //In vb.net equivale a &H8000
  4.  
  5.         enum VirtualKeyStates : int
  6.         {
  7.  
  8.             VK_F10 = 0x79 // F10 in vb.net dovrebbe essere &H79
  9.  
  10.         }
  11.  
  12.  
  13.         [DllImport("user32.dll")]
  14.         static extern IntPtr GetDC(IntPtr hwnd);
  15.  
  16.         [DllImport("user32.dll")]
  17.         static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
  18.  
  19.         [DllImport("gdi32.dll")]
  20.         static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
  21.  
  22.         [DllImport("user32.dll")]
  23.         static extern short GetKeyState(VirtualKeyStates nVirtKey);
  24.  
  25.  
  26.         static public System.Drawing.Color GetPixelColor(int x, int y)
  27.         {
  28.             IntPtr hdc = GetDC(IntPtr.Zero);
  29.             uint pixel = GetPixel(hdc, x, y);
  30.             ReleaseDC(IntPtr.Zero, hdc);
  31.             Color color = Color.FromArgb((int)(pixel & 0x000000FF),
  32.                          (int)(pixel & 0x0000FF00) >> 8,
  33.                          (int)(pixel & 0x00FF0000) >> 16);
  34.             return color;
  35.         }
  36.  
  37.         private void timer1_Tick(object sender, EventArgs e)
  38.         {
  39.  
  40.             if (cerca == true)
  41.             {
  42.                 if (Convert.ToBoolean(GetKeyState(VirtualKeyStates.VK_F10)))
  43.                 {
  44.                       IntPtr hdc = GetDC(IntPtr.Zero);
  45.                       uint pixel = GetPixel(hdc, Cursor.Position.X, Cursor.Position.Y);
  46.                       ReleaseDC(IntPtr.Zero, hdc);
  47.                       Color color = Color.FromArgb((int)pixel);
  48.  
  49.                       MessageBox.Show("Colore relativo alle coordinate: " + color);
  50.                       cerca = false;
  51.                 }
  52.             }
  53.            
  54.         }
  55.  
  56.         private void button1_Click(object sender, EventArgs e)
  57.         {
  58.             cerca = true;
  59.         }




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

http://www.developerfusion.com/tools/convert/csharp-to-vb/




PM Quote