oto krótki program systemu Windows, który robi to poprawnie (bez blokowania schowka). Powinien być przystosowany do programu PowerShell i mogę zaktualizować tę odpowiedź, jeśli będę mieć czas, ale możesz również użyć tego programu bezpośrednio.
A co powiesz na PowerShell? Nie ma potrzeby instalowania innej aplikacji. Niestety, będzie trzeba utworzyć plik skryptu gdzieś w twojej PATH
...
Krótka wersja, której możesz użyć
Jeśli utworzysz plik wsadowy (np. ShowInNotepad.bat
) Z następującą zawartością i umieścisz go PATH
gdzieś:
@echo off
clip
powershell -Command $process = Start-Process -PassThru notepad;$SW_SHOW = 5;$sig = '[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) ^| Out-Null;Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait('^^V');
możesz wtedy zadzwonić echo blah | ShowInNotepad
z dowolnego miejsca!
Należy pamiętać, że to nie zakładamy, że używasz najnowszej-owski wersji systemu Windows Vista (+) i nie niepełnosprawnej PowerShell lub odinstalowane .NET Framework. Innymi słowy, będzie działać domyślna instalacja systemu Windows.
Długie wyjaśnienie i alternatywy
Najłatwiejszym sposobem jest zautomatyzowanie operacji wklejania ( Ctrl+ V). Która co najmniej jedna odpowiedź już działa, ale ta korzysta z AHK - możesz mieć więcej szczęścia, jeśli PowerShell będzie działał w zamkniętym środowisku korporacyjnym.
Przejdźmy do scenariusza, tak?
#start notepad, get process object (to get pid later)
$process = Start-Process -PassThru notepad;
# activate Notepad window
# based on http://stackoverflow.com/a/4994020/1030702
# SW_SHOW activates and shows a window http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx
$SW_SHOW = 5;
$sig = '[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';
Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;
[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) | Out-Null;
# send a "Ctrl+V" keystroke to the active window
# from http://stackoverflow.com/a/17851491/1030702
Add-Type -AssemblyName System.Windows.Forms;
[System.Windows.Forms.SendKeys]::SendWait('^V');
Jest to dość proste, więc nie będę zawracał sobie głowy wyjaśnianiem skryptu bardziej niż komentarze.
Stosowanie
Aby go użyć, wystarczy umieścić skrypt w .ps1
pliku (np. ShowInNotepad.ps1
), Umieścić go gdzieś w swoim, PATH
a następnie wywołać powershell ShowInNotepad.ps1
po umieszczeniu tekstu, który chcesz wyświetlić w schowku.
Przykład:
echo blah | clip && powershell ShowInNotepad.ps1
Niestety wykonywanie skryptów PowerShell może być czasami trudne (zasady wykonywania i wszystkie inne). Dlatego skondensowałem ten skrypt do jednowierszowego, który można wywołać bezpośrednio z wiersza polecenia, a nawet umieścić w pliku wsadowym:
powershell -Command $process = Start-Process -PassThru notepad;$SW_SHOW = 5;$sig = '[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) ^| Out-Null;Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait('^^V');
Jeśli utworzysz plik wsadowy (np. ShowInNotepad.bat
) Z następującą zawartością i umieścisz go PATH
gdzieś:
@echo off
clip
powershell -Command $process = Start-Process -PassThru notepad;$SW_SHOW = 5;$sig = '[DllImport("""user32.dll""")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);';Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32;[Win32.NativeMethods]::ShowWindow($process.Id, $SW_SHOW) ^| Out-Null;Add-Type -AssemblyName System.Windows.Forms;[System.Windows.Forms.SendKeys]::SendWait('^^V');
możesz wtedy zadzwonić echo blah | ShowInNotepad
z dowolnego miejsca!
more
Windowsa.