Avatar billede stry Nybegynder
20. september 2003 - 09:03 Der er 7 kommentarer og
1 løsning

"farveprøve-indsamler"

Jeg vil lave en lille always-on-top "farveprøve-indsamler", altså sådan at man med en lille pipette kan opsamle en farve på skærmen uanset hvilket program man befinder sig i og gemme farven i en variabel.

Jeg ved godt at det findes som freeware (formentlig i tusindtal) men jeg vil gerne lave den selv (med lidt eksperthjælp :-D).

Nogen forslag?
Avatar billede sion Nybegynder
20. september 2003 - 18:30 #1
Hej stry.

Indsæt en timer med et interval på 1 på en normal form, og indsæt derefter følgende kode for formen:

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

Private Declare Function GetDC& Lib "user32" (ByVal hwnd As Long)
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Sub Timer1_Timer()
  Dim pXY As POINTAPI, DesktopDC As Long, pFarve As Long
  GetCursorPos pXY
 
  DesktopDC = GetDC(0)
 
  pFarve = GetPixel(DesktopDC, pXY.X, pXY.Y)
  Me.BackColor = pFarve
 
  ReleaseDC 0, DesktopDC
End Sub

Så burde det funke :)
-Sion
Avatar billede stry Nybegynder
20. september 2003 - 18:36 #2
Det ser meget lovende ud, men kan "vi" udvide den således at hvis man klikker et sted på skærmen så fastholdes den pågældende farve?
Avatar billede sion Nybegynder
20. september 2003 - 20:17 #3
Du må undskylde den lange svartid, men jeg var lige væk fra computeren... Jeg har udvidet koden lidt, så museklik bliver registeret.

Option Explicit

Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long

Private Declare Function GetDC& Lib "user32" (ByVal hwnd As Long)
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal VKey As Long) As Integer

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal wi As Long, ByVal ht As Long, ByVal wFlags As Long) As Long
Private Const HWND_NOTOPMOST = -2
Private Const HWND_TOPMOST = -1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const wFlags = SWP_NOMOVE Or SWP_NOSIZE
Dim lResult As Long

Private Sub Form_Load()
  KeepOnTop Me
End Sub

Private Sub Timer1_Timer()
  Dim pXY As POINTAPI, DesktopDC As Long, pFarve As Long
  GetCursorPos pXY
 
  DesktopDC = GetDC(0)
 
  If CBool(GetAsyncKeyState(vbLeftButton)) = True Then  'Venstreklik
    pFarve = GetPixel(DesktopDC, pXY.X, pXY.Y)
    Me.BackColor = pFarve
  ElseIf CBool(GetAsyncKeyState(vbMiddleButton)) = True Then 'Middelklik
    'evt. kode
  ElseIf CBool(GetAsyncKeyState(vbRightButton)) = True Then 'Højreklik
    'evt. kode
  Else
    'evt. kode
  End If
 
  ReleaseDC 0, DesktopDC
End Sub

Sub KeepOnTop(frmTarget As Form)
  lResult = SetWindowPos(frmTarget.hwnd, HWND_TOPMOST, 0, 0, 0, 0, wFlags)
    'Window will stay on top
  DoEvents
End Sub

Sub RemoveOnTop(frmTarget As Form)
  lResult = SetWindowPos(frmTarget.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, wFlags)
    'Window will not stay on top
  DoEvents
End Sub

Dog er museikonet stadig det normale, og brugeren er derfor måske ikke opmærksom på at når han/hun klikker med musen bliver farven fanget - jeg kikker lige på noget med at ændre cursor'ens ikon, og vender så tilbage til dig...
Avatar billede stry Nybegynder
20. september 2003 - 20:40 #4
>>Sion
Det bliver virkelig godt det her :-D
Og hvis vi får ikonet med bliver det perfekt!
Mange tak for hjælpen foreløbig.
Avatar billede sion Nybegynder
20. september 2003 - 20:45 #5
Jaah, jeg har kikket lidt på det at skifte museikonet vha. API, og jeg har også fundet nogle kald der kan ordne det, men det virker af en eller anden grund ikke helt ordentligt. Kun nogle gange bliver cursoreren ændret og/eller ændret tilbage til den originale...
Men måske skulle vi prøve at lave det hele på en lidt anden, og simplere, måde?
Vi kan tage et skærmbillede, og lægge det ind som baggrund på formen som så skal fylde hele skærmen - det vil bevirke at formen ikke ses. Jeg skal lige spise, men bagefter kan jeg lave det og så kan du jo selv vælge hvilken løsning du vil bruge :)
Avatar billede sion Nybegynder
20. september 2003 - 21:19 #6
Istedet for at sidde og bikse med koden, har jeg zippet to eksempler til dig. De er begge fra planet-source-code.com, og kan hentes på følgende addresse:
http://80.62.178.58/icysoft/screencapture.zip
Avatar billede stry Nybegynder
20. september 2003 - 21:39 #7
Hej Sion
Tusind tak for hjælpen,
her er dine meget velfortjente point :-))
Avatar billede sion Nybegynder
20. september 2003 - 22:47 #8
Det var så lidt ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester