Отправить текст в буфере обмена в приложение, как Блокнот (C # или Powershell) - PullRequest
5 голосов
/ 26 сентября 2010

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

Как этого добиться в C # или Powershell?

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

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

Ответы [ 5 ]

2 голосов
/ 26 сентября 2010

Одна (хакерская) стратегия будет выглядеть так:

  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);
}
2 голосов
/ 26 сентября 2010

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

Версия AutoHock

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

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

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

Версия PowerShell

Вам необходимо использовать редактор, такой как Notepad2 . С переключателем /c он запускает Блокнот2 и вставляет текст из буфера обмена.

Чтобы сделать его более полезным, я использую функцию tnp, определенную так: (обратите внимание, что вам нужно запустить PowerShell с параметром -sta, иначе они не будут работать некорректно)

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 голосов
/ 26 сентября 2010

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

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

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

1 голос
/ 11 октября 2010

Если вы в конечном итоге используете 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 голосов
/ 03 декабря 2015
    Dim temp = System.IO.Path.GetTempFileName()
    System.IO.File.WriteAllText(temp, Clipboard.GetText())
    Process.Start("Notepad.exe", temp)
...