Seite 1 von 1

ClipBoarder

Verfasst: 22.10.2005 23:44
von benpicco
Ich hab mal ein kleines Program gebastelt mit dem man Screenshots machen und kopierten Text verwalten kann.
Download

Code: Alles auswählen

Enumeration
  #Window
  #dir
  #search
  #format
  #comp
  #c_txt
  #state
  #Icon
  #Qwin
  #Qbut
  #Qtrak
EndEnumeration
Global typ.l, Selected.w
NewList text.s()
UseJPEGImageEncoder()
UsePNGImageEncoder()
Procedure popup()
  If CreatePopupMenu(0)
    MenuItem(1, "aktiv")
    SetMenuItemState(0,1,1)
    MenuItem(2, "Pfad")
    MenuItem(7, "Qualität")
    OpenSubMenu("Format")
    MenuItem(3, "bmp")
    MenuItem(4, "png")
    MenuItem(5, "jpg")
    CloseSubMenu()
    If CountList(text())<>0
      MenuBar()
      OpenSubMenu("Kopierter text")
    ForEach text()
      MenuItem(9+ListIndex(text()),Left(Trim(text()),10)+"...")
    Next
     SetMenuItemState(0,Selected,1)
    CloseSubMenu()
    MenuItem(8,"löschen")
  EndIf
  MenuBar()
    MenuItem( 6, "Quit")
    SetMenuItemState(0,3+GetGadgetState(#format),1)
    Select GetGadgetState(#format)
      Case 0
        DisableMenuItem(7,1)
      Case 1
        DisableMenuItem(7,1)
      Case 2
        DisableMenuItem(7,0)
    EndSelect
    
  EndIf
EndProcedure
Procedure WatchClipbrd(Count)
  Repeat
    Delay(100)
    daten=GetClipboardData(#PB_ClipboardImage)
    text.s=GetClipboardText()
    If daten<>0
      Count=0
      comp=0
      directory$=GetGadgetText(#dir)
      format$=GetGadgetText(#format)
      If format$=".jpg"
        comp=GetGadgetState(#comp)
      EndIf
      ExamineDirectory(0,directory$,"*"+format$)
      Repeat
        type=NextDirectoryEntry()
        If type=1
          Count+1
        EndIf
      Until type=0
      ExamineDesktops()
      CreateImage(0,DesktopWidth(0),DesktopHeight(0))
      StartDrawing(ImageOutput())
      DrawImage(daten,0,0)
      StopDrawing()
      SaveImage(0,directory$+"\screenshot"+Str(Count)+format$,typ,comp)
      SetGadgetText(#state,"screenshot"+Str(Count)+format$+" gespeichert")
      FreeImage(0)
      ClearClipboard()
    EndIf 
    If Len(text)>0
      found=0
      ForEach text()
        If text()=text
          found=1
          Break
        EndIf
      Next
      If found=0
        AddElement(text())
        text()=text
        ForEach text()
          SetMenuItemState(0,ListIndex(text())+9,0)
        Next
        SetMenuItemState(0,CountList(text())+8,1)
        Selected=CountList(text())+8
        popup()
      EndIf 
 
    EndIf
 
  
  ForEver
EndProcedure 
Procedure SaveSettings()
  DeleteFile("settings.dat")
  OpenFile(0,"settings.dat")
  WriteStringN(GetGadgetText(#dir))
  WriteByte(GetGadgetState(#format))
  WriteByte(GetGadgetState(#comp))
  CloseFile(0)
EndProcedure
Procedure Qualwahl()
  OpenWindow(#Qwin,DesktopMouseX(),DesktopMouseY(),100,20,#PB_Window_BorderLess,"Qualität",WindowID(#Window))
  CreateGadgetList(WindowID())
  TrackBarGadget(#Qtrak,1,1,60,17,0,10,#PB_TrackBar_Ticks)
  ButtonGadget(#Qbut,62,1,20,17,"OK")
  SetGadgetState(#Qtrak,GetGadgetState(#comp))
  Repeat
    Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
      GadgetID=EventGadgetID()
    EndIf
    
    
  Until GadgetID=#Qbut
  SetGadgetState(#comp,GetGadgetState(#Qtrak))
  SaveSettings()
  SetGadgetText(#c_txt,"Qualität:"+Str(GetGadgetState(#comp)))
  CloseWindow(#Qwin)
EndProcedure  
hWnd.l=OpenWindow(#Window,100,100,100,100,#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered,"ClipIt!")
CreateGadgetList(WindowID())
StringGadget(#dir,1,1,90,20,"C:\")
ButtonGadget(#search,92,1,18,20,"..")
ComboBoxGadget(#format,1,22,50,70)
AddGadgetItem(#format,0,".bmp")
AddGadgetItem(#format,1,".png")
AddGadgetItem(#format,2,".jpg")
SetGadgetState(#format,0)
TextGadget(#c_txt,1,45,50,15,"Qualität:7")
TrackBarGadget(#comp,55,45,60,15,0,10,#PB_TrackBar_Ticks)
SetGadgetState(#comp,7)
TextGadget(#state,1,70,98,40,"          bereit")
ClearClipboard()
OpenFile(0,"settings.dat")
SetGadgetText(#dir,ReadString())
SetGadgetState(#format,ReadByte())
SetGadgetState(#comp,ReadByte())
CloseFile(0)
SetGadgetText(#c_txt,"Qualität:"+Str(GetGadgetState(#comp)))
CatchImage(1,?icon)
AddSysTrayIcon(#Icon,WindowID(#Window),ImageID())
SysTrayIconToolTip(#Icon, "Zwischenablage wird überwacht")
popup()

ThreadID=CreateThread(@WatchClipbrd(),0)
ThreadPriority(ThreadID,10)
Goto enablecomp  
While WindowEvent():Wend

Repeat
  EventID=WaitWindowEvent()
  If EventID=#PB_Event_Gadget
    GadgetID=EventGadgetID()

    If GadgetID=#search
      path$=PathRequester("Pfad wählen",GetGadgetText(#dir))
      If Len(path$)>0
        SetGadgetText(#dir,path$)
        SaveSettings()
      EndIf
    ElseIf GadgetID=#comp
      SetGadgetText(#c_txt,"Qualität:"+Str(GetGadgetState(#comp)))
      SaveSettings()
    ElseIf GadgetID=#format
      enablecomp:
      Select GetGadgetText(#format)
        Case ".bmp"
          DisableGadget(#comp,1)
          DisableMenuItem(7,1)
          typ=#PB_ImagePlugin_BMP
          SetMenuItemState(0,3,1)
          SetMenuItemState(0,4,0)
          SetMenuItemState(0,5,0)
        Case ".png"
          DisableGadget(#comp,1)
          DisableMenuItem(7,1)
          typ=#PB_ImagePlugin_PNG
          SetMenuItemState(0,3,0)
          SetMenuItemState(0,4,1)
          SetMenuItemState(0,5,0)
        Case ".jpg"
          DisableGadget(#comp,0)
          DisableMenuItem(7,0)
          typ=#PB_ImagePlugin_JPEG
          SetMenuItemState(0,3,0)
          SetMenuItemState(0,4,0)
          SetMenuItemState(0,5,1)
      EndSelect
      SaveSettings()
    ElseIf GadgetID=#dir
      SaveSettings()
    EndIf
    
  ElseIf EventID=#PB_Event_SysTray
    EventType=EventType()
    If EventType=#PB_EventType_RightClick
      DisplayPopupMenu(0, WindowID())
    ElseIf EventType=#PB_EventType_LeftClick
      state=(state-1)/-1
      HideWindow(#Window,state)
      popup()
    EndIf
    
  ElseIf EventID=#PB_Event_Menu
   
    EvMID= EventMenuID()  ; To see which menu has been selected
      
    If EvMID= 1 ; aktiv
        If GetMenuItemState(0,1)=1
        SetMenuItemState(0,1,0)
        PauseThread(ThreadID)
        SetGadgetText(#state,"inaktiv")
        SysTrayIconToolTip(#Icon,"Überwachung der Zwischenablage angehalten")
      Else
        SetMenuItemState(0,1,1)
        ResumeThread(ThreadID)
        SetGadgetText(#state,"bereit")
        SysTrayIconToolTip(#Icon,"Zwischenablage wird überwacht")
      EndIf
    ElseIf EvMID= 2 ; pfad
      path$=PathRequester("Pfad wählen",GetGadgetText(#dir))
      If Len(path$)>0
        SetGadgetText(#dir,path$)
        SaveSettings()
      EndIf
    ElseIf EvMID= 3
          SetGadgetState(#format,0)
          DisableGadget(#comp,1)
          DisableMenuItem(7,1)
          typ=#PB_ImagePlugin_BMP
          SetMenuItemState(0,3,1)
          SetMenuItemState(0,4,0)
          SetMenuItemState(0,5,0)
          SaveSettings()
        ElseIf EvMID= 4
          SetGadgetState(#format,1)
          DisableMenuItem(7,1)
          DisableGadget(#comp,1)
          typ=#PB_ImagePlugin_PNG
          SetMenuItemState(0,3,0)
          SetMenuItemState(0,4,1)
          SetMenuItemState(0,5,0)
           SaveSettings()
        ElseIf EvMID= 5
          SetGadgetState(#format,2)
          DisableGadget(#comp,0)
          DisableMenuItem(7,0)
          typ=#PB_ImagePlugin_JPEG
          SetMenuItemState(0,3,0)
          SetMenuItemState(0,4,0)
          SetMenuItemState(0,5,1) 
         SaveSettings()
       ElseIf EvMID= 6 ; Quit
        KillThread(ThreadID)
        End
      ElseIf EvMID=7
        Qualwahl()
      ElseIf EvMID=8
        SetMenuItemState(0,Selected,0)
        SelectElement(text(),Selected-9)
        DeleteElement(text(),1)
        Selected=CountList(text())+8
        ClearClipboard()
        popup()
      ElseIf EvMID>8
        ForEach text()
          SetMenuItemState(0,ListIndex(text())+9,0)
        Next
        SelectElement(text(),EvMID-9)
        SetMenuItemState(0,EvMID,1)
        Selected=EvMID
        SetClipboardText(text())
      EndIf
    EndIf
    If IsIconic_(hWnd.l) = 1 And state=0
      state=(state-1)/-1
      HideWindow(#Window,state)
      popup()
    EndIf
    
    
Until EventID=#PB_Event_CloseWindow
KillThread(ThreadID)
End
DataSection
icon:IncludeBinary "icon.ico"
EndDataSection

Verfasst: 23.10.2005 00:02
von Mischa
Hi @benpicco!

Die 'WatchClipbrd()' Funktion erscheint mir nicht als sinnvollste
Lösung, da man die Überwachung auch per Clipboard-Event
in 'nem Callback sauberer regeln kann.

Ich glaube Agent hat das mit seinem Teil genauso wie Du gemacht
und verpasst scheinbar dadurch manches 'Erieignis'.. :wink:

Ich habe übrigens auch mal ein Programm kreiert mit dem
man Bilder und Texte aus der Zwischenablage fischen kann. /:->

Es heißt ClipIt!

http://forums.purebasic.com/german/viewtopic.php?t=1672
http://forums.purebasic.com/german/viewtopic.php?t=1719

<)

Gruß,
Mischa

Verfasst: 23.10.2005 14:12
von benpicco
Mischa hat geschrieben:Hi @benpicco!

Die 'WatchClipbrd()' Funktion erscheint mir nicht als sinnvollste
Lösung, da man die Überwachung auch per Clipboard-Event
in 'nem Callback sauberer regeln kann.
Werd ich mir mal die Clipboard WinAPI anschauen...
Mischa hat geschrieben: Ich habe übrigens auch mal ein Programm kreiert mit dem
man Bilder und Texte aus der Zwischenablage fischen kann. /:->

Es heißt ClipIt!

http://forums.purebasic.com/german/viewtopic.php?t=1672
http://forums.purebasic.com/german/viewtopic.php?t=1719

<)

Gruß,
Mischa
Ups :oops:
Dein Programm ist wirklich um einiges besser als meins...
Ich werde meins mal umbenennen...

Verfasst: 12.09.2006 14:56
von Thatsanee
Mischa hat geschrieben:Hi @benpicco!

Die 'WatchClipbrd()' Funktion erscheint mir nicht als sinnvollste
Lösung, da man die Überwachung auch per Clipboard-Event
in 'nem Callback sauberer regeln kann. ...
Hi,
das mit dem Clipboard-event in einer Callback würde mich auch interessieren.
Hab da im Handbuch nichts passendes finden können.

Wie genau ist die Callback denn aufgebaut ?
Kleiner Beispielcode wäre super.

Verfasst: 12.09.2006 16:05
von Tafkadasom2k5
Thatsanee hat geschrieben:[...]das mit dem Clipboard-event in einer Callback würde mich auch interessieren.
Hab da im Handbuch nichts passendes finden können
...ein bisschen Suchen, und die wäre das hier aufgefallen...

Gr33tz
Tafkadasom2k5

Verfasst: 12.09.2006 18:24
von Thatsanee
Tafkadasom2k5 hat geschrieben:...ein bisschen Suchen, und die wäre das hier aufgefallen...

Gr33tz
Tafkadasom2k5
Hi,
na dann habe ich mich scheinbar wohl wieder verkehrt ausgedrückt.
Wie man eine CallBack Programmiert ist schon klar. Suche falls es das
überhaupt gibt die Konstante welche abgegragt werden muß wenn sich
der Inhalt des Clipboards geändert hat.

Verfasst: 12.09.2006 18:37
von Kiffi
Thatsanee hat geschrieben:das mit dem Clipboard-event in einer Callback würde mich auch interessieren.
es gibt eine sogenannte Clipboard-Chain, in die man sein Programm mit
SetClipboardViewer_() hängen kann. Dann werden nacheinander alle
Programme, die in dieser Kette hängen benachrichtigt, wenn sich der Inhalt
des Clipboards geändert hat:

http://www.purebasic.fr/english/viewtopic.php?t=20664

Grüße ... Kiffi

Verfasst: 12.09.2006 19:24
von Thatsanee
Danke Kiffi,

klappt super damit.