2010-09-25 11 views
5

Desidero poter inviare il testo negli Appunti, in Windows, a un'applicazione. Ad esempio, sto lavorando su un file di testo nel blocco note e voglio copiare una parte in un nuovo file. Voglio copiarlo negli Appunti e quindi usare un tasto di scelta rapida per avviare un'applicazione o uno script di PowerShell che invia che copiava il testo in una nuova istanza di Blocco note.Invia testo negli Appunti all'applicazione come Blocco note (C# o PowerShell)

Come posso ottenere questo in C# o PowerShell?

Using AutoHotKey

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

risposta

2

Ho 2 soluzioni, una che utilizza PowerShell, l'altra che utilizza Autohotkey.

Autohotkey versione

vorrei utilizzare questo;) Definite tasto personalizzato e le azioni legate ai tasti. Il mio file contiene questo codice:

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

Corre notepad2 e poi simula premendo Alt + E e P. che incolla la stringa allo stesso modo è necessario premere da soli. Per qualche motivo ho avuto qualche problema con 'premendo' Ctrl + V (non me lo ricordo più). Per maggiori informazioni dai un'occhiata al sito Web di Autohotkey.

versione PowerShell

È necessario utilizzare un editor come Notepad2. Con lo switch /c avvia il Blocco note2 e incolla il testo dagli Appunti.

Per renderlo più utile io uso la funzione tnp definita in questo modo: (si noti che è necessario eseguire PowerShell con il parametro -sta, altrimenti non lavorare 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 queste funzioni è possibile eseguire qualcosa di simile:

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

In altre parole - se qualche informazione sarebbe ritornato e formattato allo schermo, si può ottenere e incolla per notepad.

2

Per iniziare, nella biblioteca eccellente PowerShell Community Extensions c'è Get-Clipboard cmdlet che ottiene il contenuto della clipboard di corrente. Da lì è abbastanza banale per fare quello che vuoi con i dati degli appunti, come ad esempio:

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

L'esecuzione del sopra ottiene il contenuto degli Appunti attuali, li mette in test.txt e quindi apre test.txt in notepad.

+0

mi piace questo ... I c potrebbe fare un passo in più per cancellare il file una volta aperto, poiché tutto quello che mi interessa è ottenere i dati nell'editor. – ctorx

2

One (hacker) strategia sarebbe:

  1. avviare il processo.
  2. Attiva la finestra principale.
  3. Simulare i tratti chiave come richiesto.

[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()); 
} 

Nel caso specifico di un editor di testo come blocco note che accetta il percorso di un file di testo come un argomento della riga di comando, si poteva fare qualcosa di più robusto, ma meno flessibile:

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

Se si finisce per utilizzare AutoHotKey, Aggiungi ClipWait per assicurarsi AutoHotKey attende per Windows per cambiare in realtà negli appunti

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

Se si desidera utilizzare solo negli appunti come un mezzo temporaneo per trasferire il testo (quindi non perdere quello che si è salvato precedentemente nella clipboard), è possibile aggiungere qualcosa di simile a quanto segue:

^+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

Aggiungi alcuni commenti sulla tua soluzione sul perché e come risolve il problema –

Problemi correlati