2010-09-25 27 views
5

Deseo poder enviar el texto en el portapapeles, en Windows, a una aplicación. Por ejemplo, estoy trabajando en un archivo de texto en el bloc de notas, y quiero copiar una porción en un nuevo archivo. Quiero copiarlo en el portapapeles y luego usar una tecla de acceso rápido para iniciar una aplicación o script de powershell que envíe que copió el texto a una nueva instancia de Bloc de notas.Enviar texto en el portapapeles a la aplicación como el Bloc de notas (C# o Powershell)

¿Cómo puedo lograr esto en C# o Powershell?

SOLUCIÓN: El uso de AutoHotKey

^+c:: 
Send ^c 
Run Notepad 
WinWait Untitled - Notepad 
WinActivate 
Send ^v 
return 

Respuesta

2

Tengo 2 soluciones, una que usa PowerShell, la otra que usa Autohotkey.

Autohotkey versión

me gustaría utilizar este;) Se define clave personalizada y las acciones asociadas a las teclas. Mi archivo contiene este código:

^#n:: 
    Run, Notepad 
    WinWaitActive Untitled - Notepad2 
    Send !e 
    Send p 
    return 

Se ejecuta notepad2 y luego simula presionando Alt + E y P. Eso pastas de la cadena de la misma manera que hay que oprimir por sí mismo. Por alguna razón tuve algunos problemas con 'presionar' Ctrl + V (ya no recuerdo eso). Para obtener más información, eche un vistazo al sitio web de Autohotkey.

versión PowerShell

Es necesario utilizar un editor como Notepad2. Con el interruptor /c, lanza Notepad2 y pega el texto del portapapeles.

para que sea más útil función tnp definido como esto utilizo: (tenga en cuenta que es necesario ejecutar PowerShell con el parámetro -sta, de lo contrario no van a trabajar propely)

function tnp { 
    param(
     [Parameter(Mandatory=$true,ValueFromPipeline=$true)] 
     [object] 
     $InputObject 
    ) 
    begin { $objs = @() } 
    process { $objs += $InputObject } 
    end { 
     $old = Get-clipboard # store current value 
     $objs | out-string -width 1000 | Set-Clipboard 
     notepad /c 
     sleep -mil 500 
     $old | Set-Clipboard # restore the original value 
    } 
} 

function Set-Clipboard { 
    param(
    [Parameter(Mandatory=$true,ValueFromPipeline=$true,Position=0)][object]$s 
) 
    begin { $sb = new-object Text.StringBuilder } 
    process { 
    $s | % { 
     if ($sb.Length -gt 0) { $null = $sb.AppendLine(); } 
     $null = $sb.Append($_) 
    } 
    } 
    end { Add-Type –a system.windows.forms; [windows.forms.clipboard]::SetText($sb.Tostring()) } 
} 

function Get-Clipboard { 
    Add-Type –a system.windows.forms 
    [windows.forms.clipboard]::GetText() 
} 

Con estas funciones se puede ejecutar algo como esto:

# gets list of members, opens Notepad2 and pastes the content (members list) 
(get-date) | gm | tnp 

En otras palabras - si algo de información sería devuelto y el formato de pantalla, puede conseguirlo y pegar en el bloc de notas.

2

Para empezar, en la excelente biblioteca PowerShell Community Extensions hay Get-Clipboard cmdlet que recibe el contenido del portapapeles de la actual. Desde allí es bastante trivial para hacer lo que quiera con los datos del portapapeles, tales como:

Get-Clipboard > test.txt; notepad test.txt 

Ejecución del anterior obtiene el contenido actual del portapapeles, los pone en test.txt y luego se abre test.txt en el bloc de notas.

+0

me gusta este ... I c Sería un paso adicional para eliminar el archivo una vez que se haya abierto, ya que lo único que me importa es obtener los datos en el editor. – ctorx

2

Una estrategia (hacker) sería:

  1. iniciar el proceso.
  2. Activar su ventana principal.
  3. Simula las pulsaciones de tecla según sea necesario.

[DllImport("user32.dll")] 
private static extern bool SetForegroundWindow(IntPtr hWnd); 

[STAThread] 
static void Main() 
{ 
    var p = Process.Start("Notepad.exe"); 
    p.WaitForInputIdle(); 
    SetForegroundWindow(p.MainWindowHandle); // this can probably be left out. 
    SendKeys.SendWait(Clipboard.GetText()); 
} 

En el caso específico de un editor de texto como el bloc de notas que acepta una ruta a un archivo de texto como un argumento de línea de comandos, se podría hacer algo más robusto pero menos flexible:

[STAThread] 
static void Main() 
{ 
    var tempFilePath = Path.GetTempFileName(); 
    File.WriteAllText(tempFilePath , Clipboard.GetText()); 
    Process.Start("Notepad.exe", tempFilePath); 
} 
1

Si terminas usando AutoHotKey, Añadir ClipWait para asegurarse AutoHotKey espera para Windows para realmente cambiar el portapapeles

^+c:: 
Send ^c 
ClipWait 
Run Notepad 
WinWait Untitled - Notepad 
WinActivate 
Send ^v 
return 

Si sólo desea utilizar el portapapeles como un medio temporal para transferir el texto (por lo tanto no se pierde lo que había guardado previamente en el portapapeles), puede añadir algo como lo siguiente:

^+c:: 
ClipSaved := ClipboardAll ; Save the entire clipboard to a variable of your choice. 
Send ^c 
ClipWait ; Wait for the clipboard to change 
Run Notepad 
WinWait Untitled - Notepad 
WinActivate 
Send ^v 
Clipboard := ClipSaved ; Restore the original clipboard. 
ClipSaved = ; Free the memory in case the clipboard was very large. 
return 
0
Dim temp = System.IO.Path.GetTempFileName() 
    System.IO.File.WriteAllText(temp, Clipboard.GetText()) 
    Process.Start("Notepad.exe", temp) 
+2

Agregue algunos comentarios sobre su solución sobre por qué y cómo resuelve el problema –

Cuestiones relacionadas