2010-09-25 2 views
5

Я хочу, чтобы иметь возможность отправлять текст в буфер обмена, в Windows, в приложение. Например, я работаю над текстовым файлом в блокноте, и я хочу скопировать часть в новый файл. Я хочу скопировать его в буфер обмена, а затем использовать горячую клавишу для запуска приложения или скрипта powershell, который отправляет который скопировал текст в новый экземпляр Notepad.Отправить текст в буфер обмена для приложения, например, Блокнот (C# или Powershell)

Как я могу достичь этого на C# или Powershell?

РЕШЕНИЕ: Использование AutoHotKey

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

ответ

2

У меня есть 2 решения, в которых используется PowerShell, а другой используется Autohotkey.

AutoHotKey версия

Я хотел бы использовать это один;) Вы определяете пользовательский ключ и действия, связанные с ключами. Мой файл содержит этот код:

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

Он работает notepad2, а затем имитирует нажатие Alt + E и P. Это вставляет струнные таким же образом, как вы нажмете ее самостоятельно. По какой-то причине у меня возникли проблемы с нажатием Ctrl + V (я этого больше не помню). Для получения дополнительной информации см. Веб-сайт Autohotkey.

версия PowerShell

Вы должны использовать редактор как Notepad2. С помощью переключателя /c он запускает Notepad2 и вставляет текст из буфера обмена.

Чтобы сделать его более полезным я использую функцию tnp определенной следующим образом: (обратите внимание, что вам нужно запустить PowerShell с -sta параметром, в противном случае они не будут работать 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() 
} 

С эти функции вы можете запустить что-то вроде этого:

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

другими словами - если какая-то информация будет возвращен и отформатированы на экран, вы можете получить его и вставить в блокнот.

2

Для начала, в отличной PowerShell Community Extensions библиотеки есть Get-Clipboard Командлета, который получает содержимое относительно текущего буфера обмена. Оттуда это довольно тривиальной делать все, что вы хотите с данными в буфере обмена, такие как:

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

Запуск выше получает текущее содержимое буфера обмена, устанавливает их в test.txt, а затем открывает test.txt в блокноте.

+0

Мне нравится этот ... I C ould дополнительный шаг для удаления файла после его открытия, так как все, о чем я забочусь, это получение данных в редакторе. – ctorx

2

One (хак) стратегия будет:

  1. Запуска процесс.
  2. Активируйте главное окно.
  3. Имитировать нажатия клавиш по мере необходимости.

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

В конкретном случае текстового редактора, например блокнот, который принимает путь к текстовому файлу в качестве аргумента командной строки, вы могли бы сделать что-то более надежным, но менее гибки:

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

Если вы в конечном итоге с помощью AutoHotkey, Добавить ClipWait, чтобы убедиться, что AutoHotKey ждет Windows, на самом деле изменить буфер обмена

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

Если вы хотите использовать буфер обмена в качестве временного средства для передачи текста (при этом не потерять то, что вы ранее сохраненные в буфере обмена), вы можете добавить что-то вроде следующего:

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

Пожалуйста, добавьте несколько комментариев о своем решении о том, почему и как оно решает проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^