Ir al contenido


Foto

Copiar contenido al portapapeles sin usar los comandos CTRL+C


  • Por favor identifícate para responder
5 respuestas en este tema

#1 systemix

systemix

    Member

  • Miembros
  • PipPip
  • 15 mensajes

Escrito 16 febrero 2015 - 02:56

Buenas tardes para todos, espero que estén bien en estos días de asueto de carnaval  (y).

Actualmente estoy desarrollando una aplicación, donde una de sus funciones es obtener el texto seleccionado (sombreado) de cualquier parte de Windows, sea navegadores, archivos de texto, o cualquier otro lugar donde se pueda sombrear el archivo.

En una anterior oportunidad (http://www.delphiacc...oradores-txt-)/), me ayudaron mucho sugiriéndome y dándome ejemplos con el visor de portapapeles, es decir, que el texto sombreado por el usuario fuera copiado al portapapeles, para luego traérmelo con un programa a través del visor clipboard. Lo cual me funcionó a la perfección.

En el proyecto en el cual estoy trabajando, el usuario usa una hotkey personalizada, que registra el programa, la cual es CTRL+Q. Cuando el usuario presiona las teclas de esta HotKey, por dentro del código del programa se simula el presionado de teclas CTRL+C. Lo cual me ha funcionado:
 

delphi
  1. //Inicio del programa private
  2.     { Private declarations }
  3.     hotKeyCTRLQ: integer;
  4.     VisorClipbrd: HWND;
  5.     //Gestión de HotKeys (accesos directos)
  6.     procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  7. //Captura HOtKey
  8.     procedure CrearHotKeyCtrlQ;
  9.     procedure DestruirHotKeyCtrlQ;
  10.     //Gestión Clipboards
  11.     procedure ObtenerValorClipboard;
  12. end;
  13. //Implementación de Métodos:
  14. procedure TformPrincipal.CrearHotKeyCtrlQ;
  15. begin
  16.   hotKeyCtrlQ:= GlobalAddAtom('hotKeyCtrlQ_nombre');
  17.   RegisterHotKey(Handle, hotKeyCtrlQ, MOD_CONTROL, Ord('Q'));
  18. end;
  19. procedure TformPrincipal.DestruirHotKeyCtrlQ;
  20. begin
  21.   UnRegisterHotKey(Handle, hotKeyCtrlQ);
  22.   GlobalDeleteAtom(hotKeyCtrlQ);
  23. end;
  24. //Acá de detecta la HotKey presionada por el usuario, y la simulación CTRL+C
  25. procedure TformPrincipal.WMHotKey(var Msg: TWMHotKey);
  26. begin
  27.   if Msg.HotKey = hotKeyCtrlQ then
  28.     begin
  29.       ClipBoard.Clear;
  30.       repeat
  31.         //Realiza iteraciones hasta que el usuario suelte los botones.
  32.       until (GetAsyncKeyState(Ord('Q')) = 0) and (GetAsyncKeyState(VK_CONTROL) = 0);
  33.       //Acá se hace la simulación de teclas CTRL+C
  34.       keybd_event(VK_CONTROL,0,0,0);
  35.       keybd_event(Ord('C'),0,0,0);
  36.       keybd_event(Ord('C'),0,2,0);
  37.       keybd_event(VK_CONTROL,0,2,0);
  38.     //En lugar de la simulación de acá arriba, se colocaría la función de copiado (¡si se puede!)
  39.     end;
  40. end;

Sin embargo, yo trabajo con una aplicación (desarrollada por una compañía ajena a mí), donde uno de los campos de edición (importantes para mi proyecto) bloquea las HotKeys CTRL+C, para copiar al portapapeles. Por lo que es indiferente de que el usuario presione CTRL+Q o CTRL+C, ya que el contenido no se copia al portapapeles.

Esto me motiva a preguntarles si existe alguna forma de copiar contenido al portapapeles sin usar los comandos CTRL+C. Quizás se podría llamar a la función misma de Windows para copiar, o con un código de bajo nivel, no lo se, estoy confundido  :|  :s

Estoy programando en delphi xe2 con windows 7.
Disculpen el testamento y gracias de antemano por la atención  (y) :)
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 17 febrero 2015 - 04:15

Esa aplicacion debe tener bloqueado el mensaje de windows de copiar al portapapeles, con lo que ni Ctrl+C ni enviando el mensaje directo al proceso te funcionaran.

En phyton se puede hacer asi por lo que he encontrado (http://stackoverflow...e-active-window):


php
  1. wnd = win32ui.GetForegroundWindow()
  2. print wnd.GetWindowText()


Supongo que incluyendo windows.pas en tu uses tendras estas funciones de win32 disponibles, es cosa de probar y si no añadirlas "a mano".
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 17 febrero 2015 - 09:28

Quizás este truco te ayude.

Usa esta utilidad, si te funciona, el truco anterior te servirá.

Saludos.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 17 febrero 2015 - 09:38

Otra forma, quizás más apropiada:


cpp
  1. char Bufer[256];
  2. SendMessage(hWnd, WM_GETTEXT, (WPARAM)sizeof(Buffer), (LPARAM)Buffer);


Saludos.
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 17 febrero 2015 - 01:12

Ya en casa, he preparado un pequeño ejemplo que funciona para capturar el texto seleccionado de un control Edit de Windows:
 


php
  1. function GetSelText(hWnd: THANDLE): String;
  2. var   Buffer: PCHAR;   Size, Ini, Fin: DWORD;
  3. begin
  4.   Size:= SendMessage(hWnd,  WM_GETTEXTLENGTH, 0, 0)+1;
  5.   GetMem(Buffer, Size);
  6.   SendMessage(hWnd, WM_GETTEXT, WPARAM(Size), LPARAM(Buffer));
  7.   SendMessage(hWnd, EM_GETSEL, WPARAM(@Ini), LPARAM(@Fin));
  8.   Buffer[Fin]:= #0;
  9.   Result:= (Buffer + Ini);
  10.   FreeMem(Buffer);
  11. end;

Saludos.


  • 0

#6 systemix

systemix

    Member

  • Miembros
  • PipPip
  • 15 mensajes

Escrito 18 febrero 2015 - 06:54

Gracias amigos Sergio y escafandra  (y), voy a revisar sus sugerencias al llegar a casa y les comento al respecto.
Gracias por su tiempo  :ap:
  • 0




IP.Board spam blocked by CleanTalk.