2010-09-25 7 views
5

पर एप्लिकेशन में भेजें, मैं विंडोज़ में क्लिपबोर्ड पर टेक्स्ट को एप्लिकेशन में भेजने में सक्षम होना चाहता हूं। उदाहरण के लिए, मैं नोटपैड में एक टेक्स्ट फ़ाइल पर काम कर रहा हूं, और मैं एक हिस्से को एक नई फाइल में कॉपी करना चाहता हूं..मैं इसे क्लिपबोर्ड पर कॉपी करना चाहता हूं और फिर एक एप्लिकेशन या पावरहेल स्क्रिप्ट लॉन्च करने के लिए हॉटकी का उपयोग करना चाहता हूं जो भेजता है जिसने नोटपैड के एक नए उदाहरण में टेक्स्ट कॉपी किया।क्लिपबोर्ड में टेक्स्ट को नोटपैड (सी # या पावरहेल)

मैं इसे सी # या पावरहेल में कैसे प्राप्त कर सकता हूं?

समाधान: उपयोग करना 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 और पी दबाने simulates कि चिपकाता स्ट्रिंग उसी तरह के रूप में आप यह अपने आप से प्रेस होगा। कुछ कारणों से मुझे 'दबाने' के साथ कुछ समस्याएं थीं Ctrl + V (मुझे अब और याद नहीं है)। अधिक जानकारी के लिए Autohotkey की वेबसाइट पर एक नज़र डालें।

PowerShell संस्करण

आप Notepad2 की तरह एक संपादक का उपयोग करने की जरूरत है। स्विच /c के साथ यह नोटपैड 2 लॉन्च करता है और क्लिपबोर्ड से पाठ चिपकाता है।

यह अधिक उपयोगी बनाने के लिए मैं समारोह tnp इस तरह परिभाषित का उपयोग करें: (ध्यान दें कि आप -sta पैरामीटर के साथ PowerShell चलाने की आवश्यकता है कि, अन्यथा वे 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 cmdlet कि सामग्री की वर्तमान क्लिपबोर्ड की हो जाता है पाने के लिए। वहां से यह इस तरह के रूप में, जो कुछ भी आप क्लिपबोर्ड डेटा के साथ करना चाहते हैं काफी तुच्छ है:

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

ऊपर चल रहा है वर्तमान क्लिपबोर्ड सामग्री हो जाता है, test.txt में उन्हें सेट और फिर नोटपैड में test.txt खोलता है।

+0

मैं यह पसंद ... मैं ग एक बार खोले जाने के बाद फ़ाइल को हटाने के लिए एक अतिरिक्त कदम हो सकता है, क्योंकि मुझे लगता है कि डेटा को संपादक में डेटा मिल रहा है। – ctorx

2

एक (hackish) रणनीति होगा:

  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 इंतजार कर रहा है विंडोज वास्तव में क्लिपबोर्ड

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

कृपया अपने समाधान के बारे में कुछ टिप्पणियां जोड़ें कि यह समस्या क्यों हल करती है –

संबंधित मुद्दे