AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [nonVCL] Send to Clipboard as Name - Eigenbau

[nonVCL] Send to Clipboard as Name - Eigenbau

Ein Thema von turboPASCAL · begonnen am 26. Jan 2006 · letzter Beitrag vom 26. Jan 2006
Antwort Antwort
Benutzerbild von turboPASCAL
turboPASCAL
Registriert seit: 8. Mai 2005
Hi,

Wer kennt das nicht, man(n) (und oder auch Frau) braucht den kompletten Dateinamen mit Pfad. Irgendein Tool von MS stellt diese Funktion zwar schon zur Verfügung aber es geht ja nix über den Eigenbau.
Von diesem Programm eine Verknüpfung erstellt und ab in das SendTo-Verzeichnis von Windows
(zB. "C:\Dokumente und Einstellungen\Default User\SendTo\" für alle User). Nun kann mit 'nem Klick im Kontextmenü der Dateiname + Pfadangabe in das Clipboard kopiert werden.


Warum Poste ich das hier ?
- Wenn man mal was abgucken will. ( inc. Fehler )
- Irgend einer kann das gebrauchen.
- es ist ein "fertiges" Programm und Open-Source was sich jeder verändern kann wie er will

und:
- Wenn mir noch jemand einen Rat geben kann, zB. wie ich dieses Programm ohne Timer machen kann.

(ich hoffe der Code ist nicht zu lang, kann auf Wunsch ja verschwinden)


Delphi-Quellcode:
program SendtoClipboardAsName;

{$R 'SendtoClipboardAsName.res' 'SendtoClipboardAsName.rc'}
{$DESCRIPTION 'Send to Clipboard as Name'}

uses
  Windows, Messages;

const
  WINDOW_CLASS = 'SendtoClipboardAsNameWnd';
  WINDOW_TITLE = 'Send to Clipboard as Name V1.0';

  LWA_COLORKEY = 1; // Use crKey as the transparency color.
  LWA_ALPHA = 2; // Use Alpha to determine the opacity of the layered window.
  WS_EX_LAYERED = $80000; // Windowstyle transparent

var
  WndClass: TWndClassEx;
  Msg: TMsg;

procedure CopyTextToClipboard(aWnd: HWND; aText: PChar);
var
  Data: THandle;
  DataPtr: Pointer;
  Size: Integer;
  oldWND: HWND;
begin
  Size := Length(aText) + 1;
  OpenClipboard(aWnd); //Open Clipboard
  try
    EmptyClipboard; // Clear Clipboard
    oldWND := SetClipboardViewer(aWnd); // Clipboard für Programm registr.
    Data := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Size); // Get Memory
    try
      DataPtr := GlobalLock(Data);
      try
        Move(aText^, DataPtr^, Size);
        SetClipboardData(CF_TEXT, Data); // Clpbrd-Format as Text & send Text
      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data); // Free res. Memory
      raise; // Get global Memory Err
    end;
    ChangeClipboardChain(aWnd, oldWND);
  finally
    CloseClipboard; //Close Clipboard
  end;
end;

// --- Main Window Funktion -----------------------------------------------------
function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall;
var
  Bmp, oldBmp: HBitmap;
  MemDC: HDC;
  PS: PAINTSTRUCT;
  s: String;
  i: Integer;
begin
  Result := 0;
  case uMsg of
    WM_CREATE: // wird bei dem erstellen des Fensters aufgerufen
      begin
        SetWindowLong(hwnd, GWL_EXSTYLE,
          GetWindowLong(hwnd, GWL_EXSTYLE) or WS_EX_LAYERED);

        SetLayeredWindowAttributes(hwnd, $00FF00FF, 140, LWA_COLORKEY + LWA_ALPHA);

        // Get Cmd-Params
        s:='';
        if (ParamCount > 0) then
          for i := 1 to ParamCount do
            s := s + ' ' + paramstr(i);
        Delete(s,1,1);

        // Cmd to Clipboard
        CopyTextToClipboard(hWnd, PChar(s));

        Settimer(hWnd, 1, 250, nil);
      end;

    WM_COMMAND: ; // nix

    WM_TIMER: SendMessage(hWnd, WM_CLOSE, 0, 0);
    
    WM_PAINT:
      begin
        BeginPaint(hWnd, PS);

        MemDC := CreateCompatibleDC(0);
        Bmp:= LoadImage(hInstance, MAKEINTRESOURCE(1), IMAGE_BITMAP, 0, 0, 0);

        oldBmp := SelectObject(MemDC, Bmp);

        BitBlt(PS.hdc, 0, 0, 50, 50, MemDC, 0, 0, SRCCOPY);

        SelectObject(MemDC, oldBmp);
        DeleteDC(MemDC);
        DeleteObject(Bmp);

        EndPaint(hWnd, PS);
      end;

    WM_DESTROY:
      begin
        killtimer(hWnd, 1);
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

begin
  // Fenster Parameter festlegen
  with WndClass do
  begin
    cbSize := SizeOf(TWndClassEx);
    style := cs_hRedraw or cs_vRedraw;
    lpfnWndProc := @WndProc;
    cbClsExtra := 0;
    cbWndExtra := 0;
    hInstance := SysInit.HInstance;
    hbrBackground := CreateSolidBrush(RGB(255,0,255));
    lpszMenuName := '';
    lpszClassname := WINDOW_CLASS;
    hIcon := LoadIcon(0, IDI_APPLICATION);
    hCursor := LoadCursor(0, IDC_ARROW);
    hIconSm := 0;
  end;

  RegisterClassEx(WndClass);
  
  // Fenster erstellen
  CreateWindowEx(
    WS_EX_TOPMOST or WS_EX_TOOLWINDOW,
    WINDOW_CLASS,
    WINDOW_TITLE,
    WS_POPUP or WS_VISIBLE or WS_SYSMENU,
    Getsystemmetrics(SM_CXSCREEN)-70,
    20 {Getsystemmetrics(SM_CYSCREEN)-140},
    50,
    50,
    0,
    0,
    hInstance,
    nil);

  // "Application.Run"
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end.
Angehängte Dateien
Dateityp: zip send_to_clipboart_as_name_112.zip (21,8 KB, 29x aufgerufen)
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
 
Benutzerbild von Interceptor
Interceptor

 
Delphi 6 Professional
 
#2
  Alt 26. Jan 2006, 17:56
Kleine Korrektur:

Es heißt Clipboard, nicht Clipboart
David
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#3
  Alt 26. Jan 2006, 18:08
Freiheit des Audoren ? Thx.
Matti
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#4
  Alt 26. Jan 2006, 18:09
Ich hätte dafür eine Shellerweiterung für den Explorer geschrieben, dann hast du es im direkt Kontextmenü vom Explorer und musst nicht erst über "Senden an" gehen. Und wozu brauchst du dafür ein Fenster?

Und Flags verknüpft man mit einem logischen or.
Michael
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#5
  Alt 26. Jan 2006, 18:17
Hallo,
Zitat von turboPASCAL:
- Wenn mir noch jemand einen Rat geben kann, zB. wie ich dieses Programm ohne Timer machen kann.
Benutze einfach Delphi-Referenz durchsuchenPostMessage statt SendMessage.

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

 
Delphi 11 Alexandria
 
#6
  Alt 26. Jan 2006, 18:24
Hallo Matti,
ganz nett, kann ich sogar gut gebrauchen!

Zitat:
CopyTextToClipboard(hWnd, PChar(s));
Das funktioniert anscheind nicht, wenn ich die Zwischenablage in Word einfügen möchte...
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#7
  Alt 26. Jan 2006, 18:27
Zitat von Luckie:
Ich hätte dafür eine Shellerweiterung für den Explorer geschrieben, dann hast du es im direkt Kontextmenü vom Explorer und musst nicht erst über "Senden an" gehen.
Aha, Shellerweiterung über die Registry ? Ne, das wollte ich ja nicht...

Zitat von Luckie:
Und wozu brauchst du dafür ein Fenster?
Optische Rückmeldung als Feature...
Brauche ich. (Leseproblem)

Zitat von Luckie:
Und Flags verknüpft man mit einem logischen or.
Data := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Size); Hm, ja stimmt. Aber ich denke ein AND ist nicht komplett falsch.

Zitat von xaromz:
Hallo,
Zitat von turboPASCAL:
- Wenn mir noch jemand einen Rat geben kann, zB. wie ich dieses Programm ohne Timer machen kann.
Benutze einfach Delphi-Referenz durchsuchenPostMessage statt SendMessage.
Wie, wo ? Denkhilfe bitte.

Zitat von juergen:
Hallo Matti,
ganz nett, kann ich sogar gut gebrauchen!

Zitat:
CopyTextToClipboard(hWnd, PChar(s));
Das funktioniert anscheind nicht, wenn ich die Zwischenablage in Word einfügen möchte...
Prüfe ich nach, einen Moment bitte.

//Edit:
Ja, das stimmt. Es muss doch EmptyClipboard; ausgeführt werden was ich auskommentiert habe.
Matti
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#8
  Alt 26. Jan 2006, 18:30
Zitat von turboPASCAL:
Zitat von Luckie:
Ich hätte dafür eine Shellerweiterung für den Explorer geschrieben, dann hast du es im direkt Kontextmenü vom Explorer und musst nicht erst über "Senden an" gehen.
Aha, Shellerweiterung über die Registry ? Ne, das wollte ich ja nicht...
Nein, übereine DLL.

Zitat:
Zitat von Luckie:
Und Flags verknüpft man mit einem logischen or.
Data := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Size); Hm, ja stimmt. Aber ich denke ein AND ist nicht komplett falsch.
Doch ein And wäre komplett falsch. Ich bezog mich aber mehr auf das +:
Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
Michael
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#9
  Alt 26. Jan 2006, 18:34
Hallo,
Zitat von turboPASCAL:
Wie, wo ? Denkhilfe bitte.
Du benutzt doch den Timer, um WM_CLOSE zu schicken. Da kannst Du doch statt Settimer(hWnd, 1, 250, nil); einfach PostMessage(hWnd, WM_CLOSE, 0, 0); schreiben. Oder macht der Timer noch irgendwas?


Gruß
xaromz

[Add]In deiner Prozedur CopyTextToClipboard kannst Du Dir oldWND := SetClipboardViewer(aWnd); und ChangeClipboardChain(aWnd, oldWND); sparen, die brauchst Du nicht.[/Add]
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#10
  Alt 26. Jan 2006, 18:40
Zitat von xaromz:
Oder macht der Timer noch irgendwas?
Ja, eine kleine Pause um ein Fenster an zu zeigen. Ich wollte das Anzeigen im WM_Create mit ShowWindow(); erzwingen, das funktionert ja aber nicht.

@Luckie, ok merke ich mir. Wie könnte das mit einer DLL aussehen ? Kannst du mir das bitte mit ein paar Stichpunkten erleutern ?
Matti
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz