我需要获取未保存在硬盘驱动器上的记事本流程实例中的文本。例如,打开了记事本应用程序,其中包含字符串“ 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");
}
我希望能够从正在运行的记事本实例复制文本,而无需将其保存在硬盘驱动器上。
答案 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可能很挑剔(但易于使用),并且列表更加精细,但是使用了类似的方法。