2010-09-25 22 views
5

Metni panoya, Windows'ta bir uygulamaya gönderebilmek istiyorum. Örneğin, notepad içinde bir metin dosyası üzerinde çalışıyorum ve bir bölümünü yeni bir dosyaya kopyalamak istiyorum..Sana panoya kopyalamak ve daha sonra gönderen bir uygulama veya powershell betiğini başlatmak için bir kısayol tuşu kullanmak istiyorum metni yeni bir Not Defteri örneğine kopyaladı.Not Defteri (C# veya Powershell) gibi Uygulamaya Panoya Metin Gönderme

Bunu C# veya Powershell'de nasıl yapabilirim?

ÇÖZÜM: kullanma AutoHotKey

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

cevap

2

Autohotkey'u kullanan diğer PowerShell kullanan 2 çözümüm var.

Autohotkey versiyonu

Ben bu bir kullanırsınız;) Sen özel anahtar tanımlamak ve tuşlara bağlı eylemler. Dosyam bu kodu içerir: basılarak Alt + E ve P simüle sonra

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

Bu notepad2 çalışır ve bu macunlar dize kendiniz basın gibi aynı şekilde. Bazı sebeplerden dolayı 'Ctrl + V' tuşuna basmakla bazı problemlerim vardı (daha fazla hatırlamıyorum). Daha fazla bilgi için Autohotkey'in web sitesine bakınız.

PowerShell sürüm

Sen Notepad2 gibi bir editör kullanmak gerekir. /c anahtarıyla Not Defteri 2'yi başlatır ve metni panodan yapıştırır. (aksi takdirde propely çalışmak olmaz, -sta parametresi ile PowerShell çalıştırmak gerektiğini unutmayın)

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

olarak:

Böyle tanımlanan işlev tnp kullanmak daha kullanışlı hale getirmek için Bu işlev, böyle bir şey çalıştırabilirsiniz: başka bir deyişle

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

- bazı bilgi döndü ve ekrana biçimlendirilmiş olması olsaydı, bunu elde ve not defteri için yapıştırabilirsiniz.

2

içerik mevcut pano alır Get-Clipboard cmdlet var mükemmel PowerShell Community Extensions kütüphanede başlamanız için. Oradan gibi, sen pano verilerle istediğini yapmak için oldukça Önemsiz:

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

yukarıda Koşu, cari pano içeriğini alır test.txt bunları ayarlar ve sonra notepad metin.txt açar.

+0

: aşağıdaki gibi bir şey ekleyebilir (böylece daha önce panoya kaydedilen şeyi kaybetmek değil) Açıldıktan sonra dosyayı silmek için ekstra bir adım olabilir, çünkü tek umurumda olan veri editöre veri almaktır. – ctorx

2

One (hackish) stratejisi olacaktır:

  1. başlatın süreci.
  2. Ana penceresini etkinleştirin.
  3. Anahtar vuruşlarını gerektiği gibi yapın. Bir komut satırı bağımsız değişken olarak bir metin dosyası için bir yol kabul not defteri gibi bir metin editörü spesifik durumda
    [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()); 
    } 
    


, daha sağlam ama daha az esnek bir şey yapabilirsiniz:

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

Eğer Autohotkey kullanarak sonuna, yalnızca metin aktarmak için geçici bir araç olarak panoya kullanmak istiyorsanız, Windows aslında panoya

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

değiştirmek için emin AutoHotKey bekler hale getirmek için ClipWait ekle I c ... ben bunu sevdim

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

Lütfen çözümünüzün niçin ve nasıl çözdüğüne dair bazı yorumlar ekleyin. –

İlgili konular