gpt4 book ai didi

c# - 使用 C# 从任何窗口捕获突出显示的文本

转载 作者:太空狗 更新时间:2023-10-29 23:35:12 25 4
gpt4 key购买 nike

如何使用 C# 从任何窗口读取突出显示/选定的文本。

我尝试了两种方法。

  1. 每当用户选择某项时发送“^c”。但在这种情况下,我的剪贴板中充斥着大量不必要的数据。有时它还会复制密码。

所以我将方法改为第二种方法,发送消息方法。

查看示例代码

 [DllImport("user32.dll")]
static extern int GetFocus();

[DllImport("user32.dll")]
static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();

[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(int hWnd, int ProcessId);

[DllImport("user32.dll") ]
static extern int GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern int SendMessage(int hWnd, int Msg, int wParam, StringBuilder lParam);

// second overload of SendMessage

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, out int wParam, out int lParam);

const int WM_SETTEXT = 12;
const int WM_GETTEXT = 13;

private string PerformCopy()
{
try
{
//Wait 5 seconds to give us a chance to give focus to some edit window,
//notepad for example
System.Threading.Thread.Sleep(5000);
StringBuilder builder = new StringBuilder(500);

int foregroundWindowHandle = GetForegroundWindow();
uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
uint currentThreadId = GetCurrentThreadId();

//AttachTrheadInput is needed so we can get the handle of a focused window in another app
AttachThreadInput(remoteThreadId, currentThreadId, true);
//Get the handle of a focused window
int focused = GetFocus();
//Now detach since we got the focused handle
AttachThreadInput(remoteThreadId, currentThreadId, false);

//Get the text from the active window into the stringbuilder
SendMessage(focused, WM_GETTEXT, builder.Capacity, builder);

return builder.ToString();
}
catch (System.Exception oException)
{
throw oException;
}
}

此代码在记事本中运行良好。但是,如果我尝试从其他应用程序(如 Mozilla firefox 或 Visual Studio IDE)捕获,它不会返回文本。

谁能帮帮我,我哪里做错了?首先,我选择了正确的方法?

最佳答案

那是因为 Firefox 和 Visual Studio 都不使用内置的 Win32 控件来显示/编辑文本。

一般不可能获得“任何”选定文本的值,因为程序可以以任何方式重新实现它们自己版本的 Win32 控件认为合适,您的程序不可能期望与所有这些一起工作。

但是,您可以使用 UI Automation允许您与大多数第 3 方控件交互的 API(至少,所有优秀的控件 - 例如 Visual Studio 和 Firefox - 可能会与 UI Automation API 一起工作,因为这是一项要求无障碍)

关于c# - 使用 C# 从任何窗口捕获突出显示的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2763563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com