如何复制打开的记事本实例的内容?

时间:2019-01-28 03:39:25

标签: c# .net powershell

我需要获取未保存在硬盘驱动器上的记事本流程实例中的文本。例如,打开了记事本应用程序,其中包含字符串“ This is a notepad Window”,但仍未保存,我想在记事本中获取字符串而不将其保存到文件中。 我必须在Powershell中完成此任务。但是,如果不能在Powershell中完成,则C#是下一个最佳选择。我在堆栈溢出的答案中找到的与我的案例最接近的事情是C#中的以下代码,但我无法真正弄清楚如何利用它

我尝试转储记事本应用程序的内存数据,但这没有用。 我曾尝试为记事本应用程序创建com对象,但这是不可行的。 我讨论过的代码:

[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("User32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

private void btnCopyToNotepad_Click(object sender, EventArgs e)
{
    StartNotepad();

    Process[] notepads = null;
    while (notepads == null || notepads.Length == 0)
    {
        notepads = Process.GetProcessesByName("notepad");   
        Thread.Sleep(500);
    }

    if (notepads.Length == 0) return;
    if (notepads[0] != null)
    {
        Clipboard.SetText(textBox1.Text);
        SendMessage(FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null), 0x000C, 0, textBox1.Text);
    }
}
private static void StartNotepad() 
{
    Process.Start("notepad.exe");
}

我希望能够从正在运行的记事本实例复制文本,而无需将其保存在硬盘驱动器上。

1 个答案:

答案 0 :(得分:1)

至于...

  

我希望能够从正在运行的记事本实例中复制文本   而不将其保存在硬盘驱动器上。

...为什么要尝试抢先放置的东西?

或者...您是说,其他一些过程开始了,并在记事本中写了一些东西?

如果是这样,那么为什么不先将其他过程中的内容放到记事本中呢?

无论如何,您可以直接执行类似的操作并避免使用所有C#东西...

老学校...

$wshell = New-Object -ComObject wscript.shell
$wshell.AppActivate((Get-Process -Name notepad).MainWindowTitle) 
$wshell.SendKeys("^{A}^{C}") 

或通过.Net

[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic") 
[Microsoft.VisualBasic.Interaction]::AppActivate((Get-Process -Name notepad).MainWindowTitle) 
[System.Windows.Forms.SendKeys]::SendWait("^{A}^{C}")

OP更新

至于……

  

有机会我们可以从内存中获取文本吗?不使用   发送密钥?

不是没有使用其他第3个UI自动化工具,也没有编写自己的或内存转储的文件(但是最后一个是序列化的东西,如此...,将记事本会话保存在速度位置就像在其中一样容易)并稍后再调用。)

周围有3rdP工具可用于PowerShell UI自动化。请注意,尽管它们仍然可以工作,但不再更新。

仍然,您必须在需要打的每个系统上获得这些。

以下是列表:

WASP UiAutomation selenium FlaUI BitCollectors.UIAutomationLib AutoIt Scripting Language https://www.autoitconsulting.com/site/scripting/autoit-cmdlets-for-windows-powershell

否则,您最终会对此进行挖掘。

Inspect UI Automation Overview

根据作者的说法,对于FlaUI,您将执行以下操作。

Add-Type -Path "\Documents\WindowsPowerShell\Modules\FlaUI\src\FlaUI.UIA3\bin\Debug\FlaUI.Core.dll"
Add-Type -Path "\Documents\WindowsPowerShell\Modules\FlaUI\src\FlaUI.UIA3\bin\Debug\FlaUI.UIA3.dll"

$app = [FlaUI.Core.Application]::AttachOrLaunch('notepad')

$uia = New-Object FlaUI.UIA3.UIA3Automation

$mw = $app.GetMainWindow($uia)

$Document = $mw.FindFirstChild($uia.ConditionFactory.ByControlType([FlaUI.Core.Definitions.ControlType]::Document))

$mw.Title
$Document.Patterns.Value.Pattern.Value.Value

当然,SendKeys可能很挑剔(但易于使用),并且列表更加精细,但是使用了类似的方法。