[Tool] MultiClipBoard

11/03/2006 11:18 Busti#1
Hi all !

MultiClipBoard ist ein Programm von mir, das ich aus 2 einfachen Gründen geschrieben und Entwickelt habe.

#1 ) Ich wurde von einen User drum gebeten.
#2 ) Hatte ich soetwas noch nie im Internet gessehen.

Eine kleine beschreibung des Programms :

Mit Multiclipboard kann man so oft "ctrl+c" drücken wie man will, man verliert aber nie seinen letzten Inhalt, und ich glaube es ist schon so ziemlich jeden hier Passiert das er irgentein Passwort oder ein Link in Clip hatte und dann, weil er mal nicht nachgedacht hat, irgenteinen anderen text Kopiert hat :o.

Mit dem kleinen Programm kann man ganz simpel auswählen, welchen seiner letzten "Clips" man auswählen möchte und das beliebig oft =)

Ich hoffe ihr schau mal rein und gebt mir ein kleines Feedback =)

Ich hoffe ich habe es im richtigen Bereich gepostet :S

SourceCode :
Code:
#include <GuiConstants.au3>
#Include <Constants.au3>
#NoTrayIcon
Opt("TrayMenuMode", 1); Default tray menu items (Script Paused/Exit) will not be shown.
Opt("MustDeclareVars", 1)

Global Const $WM_DRAWCLIPBOARD = 0x0308
Global Const $WM_CHANGECBCHAIN = 0x030D

Global $origHWND, $Clips = 0, $NewMenu[100], $NewMenuArray[100]
Global $item, $emptyitem1, $emptyitem2, $aboutitem, $cleanup, $emptyitem3, $exititem, $iInStr = 0

_Main()

Func _Main()
  Local $msg = "", $gui, $iScan

  $gui = GUICreate("Clip Hook", 400, 400, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU));used to hook clipboard events only

&#59; remember last clip viewer in queue and set our GUI as first in queue
  $origHWND = DllCall("user32.dll", "hwnd", "SetClipboardViewer", "hwnd", $gui)
  $origHWND = $origHWND[0]

  GUIRegisterMsg($WM_DRAWCLIPBOARD, "OnClipBoardChange")
  GUIRegisterMsg($WM_CHANGECBCHAIN, "OnClipBoardViewerChange")

  $item = TrayCreateItem("-MultiClipBoard v1-")
  $emptyitem1 = TrayCreateItem("")
  $emptyitem2 = TrayCreateItem("")
  $aboutitem = TrayCreateItem("About")
  $cleanup = TrayCreateItem("CleanUP")
  $emptyitem3 = TrayCreateItem("")
  $exititem = TrayCreateItem("Exit")

  TraySetState()

  While 1
    $msg = TrayGetMsg()
    Select
      Case $msg = $aboutitem
        MsgBox(64, "about:", "MultiClipBoard v1 - By Busti." & @CRLF & "Simply Click ctrl+c to add smt.")
      Case $msg = $exititem
        ExitLoop
      Case $msg = $cleanup
        _CleanUp()
      Case $Clips > 0
        For $iScan = 1 To $Clips
          If $msg = $NewMenu[$iScan] Then ClipPut($NewMenuArray[$iScan])
        Next

    EndSelect
  WEnd

&#59; send notification that we no longer will be in clipboard hook queue
  DllCall("user32.dll", "int", "ChangeClipboardChain", "hwnd", $gui, "hwnd", $origHWND)
EndFunc;==>_Main

Func OnClipBoardChange($hWnd, $msg, $wParam, $lParam)
  Local $iDel, $iCreate
&#59; do what you need when clipboard changes
  $iInStr=0
  For $iCheck = 1 To $Clips
    If ClipGet() == $NewMenuArray[$iCheck] Then
      $iInStr = 1
      ExitLoop
    EndIf    
  Next
  If Not $iInStr Then
    TrayItemDelete($exititem)
    TrayItemDelete($emptyitem3)
    TrayItemDelete($cleanup)
    TrayItemDelete($aboutitem)
    TrayItemDelete($emptyitem2)
    For $iDel = $Clips To 1 Step - 1
      TrayItemDelete($NewMenu[$iDel])
    Next
    TrayItemDelete($emptyitem1)
    TrayItemDelete($item)


    $item = TrayCreateItem("-MultiClipBoard v1-")
    $emptyitem1 = TrayCreateItem("")

    $Clips += 1
    
    $NewMenuArray[$Clips] = ClipGet()

    For $iCreate = 1 To $Clips
      $NewMenu[$iCreate] = TrayCreateItem("#"&$iCreate &") "&StringLeft($NewMenuArray[$iCreate], 15) & " ...")
    Next

    $emptyitem2 = TrayCreateItem("")
    $aboutitem = TrayCreateItem("About")
    $cleanup = TrayCreateItem("CleanUP")
    $emptyitem3 = TrayCreateItem("")
    $exititem = TrayCreateItem("Exit")
  EndIf
&#59; send notification about clipboard change to next clipviewer
  DllCall("user32.dll", "int", "SendMessage", "hWnd", $origHWND, "int", $WM_DRAWCLIPBOARD, "int", $wParam, "int", $lParam)
EndFunc;==>OnClipBoardChange

Func OnClipBoardViewerChange($hWnd, $msg, $wParam, $lParam)
&#59; if our remembered previous clipviewer is removed then we must remember new next clipviewer
&#59; else send notification about clipviewr change to next clipviewer
  If $wParam = $origHWND Then
    $origHWND = $lParam
  Else
    DllCall("user32.dll", "int", "SendMessage", "hWnd", $origHWND, "int", $WM_CHANGECBCHAIN, "hwnd", $wParam, "hwnd", $lParam)
  EndIf
EndFunc;==>OnClipBoardViewerChange

Func _CleanUp()
  Local $iDel
  
  TrayItemDelete($exititem)
  TrayItemDelete($emptyitem3)
  TrayItemDelete($cleanup)
  TrayItemDelete($aboutitem)
  TrayItemDelete($emptyitem2)
  For $iDel = $Clips - 1 To 1 Step - 1
    TrayItemDelete($NewMenu[$iDel])
  Next
  TrayItemDelete($emptyitem1)
  TrayItemDelete($item)


  $item = TrayCreateItem("-MultiClipBoard v1-")
  $emptyitem1 = TrayCreateItem("")
  $emptyitem2 = TrayCreateItem("")
  $aboutitem = TrayCreateItem("About")
  $cleanup = TrayCreateItem("CleanUP")
  $emptyitem3 = TrayCreateItem("")
  $exititem = TrayCreateItem("Exit")
  $Clips = 0
  TraySetState()
EndFunc;==>_CleanUp
Hier noch ein Screen(habe schnell die Namen von irgendwelchen Datein kopiert :o) :

[Only registered and activated users can see links. Click Here To Register...]

Download :
11/03/2006 12:29 neji#2
Das funktioniert dann aber auch nur mit Texten oder?

Wenn ich eine Datei mit ctrl + c hinzufüge, dann einen Text, mir die Datei wieder "zurückhole" dann kann ich sie mit ctrl + v nicht wieder einfügen.

Demnach funktioniert das ganze zur mit Texten oder?
Bzw speichert er bei Dateien nur den Dateinamen im Clipboard.

Wäre schon wenn das auch mit Dateien, Bildern etc ginge

Außerdem fände ich es persönlich besser, wenn ich nicht den Text im kontextmenü auswählen und dann mit ctrl+v einfügen müsste, sondern dass er mir das schon automatisch einfügt.
11/03/2006 12:36 Busti#3
Quote:
Originally posted by neji@Nov 3 2006, 12:29

Wenn ich eine Datei mit ctrl + c hinzufüge, dann einen Text, mir die Datei wieder "zurückhole" dann kann ich sie mit ctrl + v nicht wieder einfügen.

Demnach funktioniert das ganze zur mit Texten oder?
Bzw speichert er bei Dateien nur den Dateinamen im Clipboard.

Wäre schon wenn das auch mit Dateien, Bildern etc ginge

Außerdem fände ich es persönlich besser, wenn ich nicht den Text im kontextmenü auswählen und dann mit ctrl+v einfügen müsste, sondern dass er mir das schon automatisch einfügt.
Quote:

Das funktioniert dann aber auch nur mit Texten oder?
Ja, da ich nicht wüsste wie ich es anders machen sollte, ausser einen buffer erstellen, aber wenn ihr dann mehrere gb große datein im Clip Speichert...nadann viel spaß :o.

Quote:

Demnach funktioniert das ganze zur mit Texten oder?
Bzw speichert er bei Dateien nur den Dateinamen im Clipboard.
Ja, nur mit Texten, er speichert keine namen, ich habe name editiert und ctrl+c gedrückt :o.

Quote:

Wäre schon wenn das auch mit Dateien, Bildern etc ginge
Ich müsste schaun wie ich das dann mit dem buffer mache...
-> Fileauslesen
-> Das ausgelesene in einer variable speichern
-> sollte es ausgewählt werden...hmm
-> argh -.-

Quote:

Außerdem fände ich es persönlich besser, wenn ich nicht den Text im kontextmenü auswählen und dann mit ctrl+v einfügen müsste, sondern dass er mir das schon automatisch einfügt.
Aber dein Main Programm verliert dann den Fokus wenn du in die trayliste hinklickst, daher weiss das Programm ja nicht wo er es hinsenden soll.
11/03/2006 13:20 NoName#4
wer haut sich denn gigabyte grosse dateien in den zwischenspeicher?^^
11/03/2006 15:12 neji#5
Quote:
Aber dein Main Programm verliert dann den Fokus wenn du in die trayliste hinklickst, daher weiss das Programm ja nicht wo er es hinsenden soll.
dann bau doch nen Shortcut ein, der das kontextmenü direkt bei der Maus öffnet und dann eben ctrl+v simuliert

für Dateien : du könntest einfach eine Funktion schreiben, die erkennt, ob im Clipboard ein Dateipfad steht, wenn ja dann lädst du diese Datei beim abrufen direkt ins Clipboard. So hast du auch nicht mehrere Dateien gleichzeitig im speicher
11/04/2006 00:13 SilonVier#6
Quote:
Originally posted by coder62@Nov 3 2006, 13:20
wer haut sich denn gigabyte grosse dateien in den zwischenspeicher?^^
Wieso läd ASP.NET mit 1GB Arbeitsspeicher beim Upload eines 2GB Files alles erst in den Arbeitsspeicher obwohl man "nur" die ersten 4KB auslesen möchte? - das sind beides Fragen, wo jede Antwort unbefriedigend wäre.
11/04/2006 23:54 Busti#7
Gibts sonst noch Feedback & oder Vorschläge ?