5

Windows のクリップボードにあるテキストをアプリケーションに送信できるようにしたいと考えています。たとえば、メモ帳でテキスト ファイルを操作していて、その一部を新しいファイルにコピーしたいと考えています。クリップボードにコピーしてから、ホットキーを使用して、送信するアプリケーションまたは PowerShell スクリプトを起動したいと考えています。テキストをメモ帳の新しいインスタンスにコピーしました。

C# または Powershell でこれを達成するにはどうすればよいですか?

解決策: AutoHotKey を使用する

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

5 に答える 5

3

PowerShell を使用するソリューションと、 Autohotkeyを使用するソリューションの 2 つがあります。

オートホットキーのバージョン

私はこれを使用します;)カスタムキーとキーにバインドされたアクションを定義します。私のファイルには次のコードが含まれています:

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

notepad2 を実行し、Alt+E と P の押下をシミュレートします。これにより、自分で押すのと同じ方法で文字列が貼り付けられます。何らかの理由で、Ctrl+V を「押す」ことに問題がありました (もう覚えていません)。詳細については、Autohotkey の Web サイトをご覧ください。

PowerShell のバージョン

Notepad2のようなエディタを使用する必要があります。スイッチ/cを使用すると、Notepad2 が起動し、クリップボードからテキストが貼り付けられます。

より便利にするために、tnp次のように定義された 関数を使用します (-sta パラメーターを指定して PowerShell を実行する必要があることに注意してください。そうしないと、適切に機能しません)。

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

つまり、情報が返されて画面にフォーマットされる場合は、それを取得してメモ帳に貼り付けることができます。

于 2010-09-25T22:09:02.550 に答える
2

1つの(ハックな)戦略は次のとおりです。

  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);
}
于 2010-09-25T20:37:00.277 に答える
2

まず、優れたPowerShell Community ExtensionsライブラリにGet-Clipboard、現在のクリップボードのコンテンツを取得するコマンドレットがあります。そこから、次のように、クリップボードのデータに対して必要なことを行うのはかなり簡単です。

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

上記を実行すると、現在のクリップボードの内容が取得され、それらが test.txt に設定され、メモ帳で test.txt が開かれます。

于 2010-09-25T20:31:24.230 に答える
1

AutoHotKey を使用することになった場合は、 ClipWaitを追加して、Windows が実際にクリップボードを変更するのを AutoHotKey が待機するようにします。

^+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
于 2010-10-10T21:30:19.637 に答える