Sendkey 或 SendInput 不从输入字段复制
Sendkey or SendInput doesn't copy from input field
我编写了一个小型控制台应用程序,它可以从 Web 应用程序复制突出显示的文本。
我正在尝试以两种方式做到这一点
1) 通过简单的 Sendkeys
SendKeys.SendWait("^C");
Application.DoEvents();
2) 通过 SendInput
Keyboard.SimulateKeyStroke('c', ctrl: true);
public static void SimulateKeyStroke(char key, bool ctrl = false, bool alt = false, bool shift = false)
{
List<ushort> keys = new List<ushort>();
if (ctrl)
keys.Add(VK_CONTROL);
if (alt)
keys.Add(VK_MENU);
if (shift)
keys.Add(VK_SHIFT);
keys.Add(char.ToUpper(key));
INPUT input = new INPUT();
input.type = INPUT_KEYBOARD;
int inputSize = Marshal.SizeOf(input);
for (int i = 0; i < keys.Count; ++i)
{
input.mkhi.ki.wVk = keys[i];
bool isKeyDown = (GetAsyncKeyState(keys[i]) & 0x10000) != 0;
if (!isKeyDown)
SendInput(1, ref input, inputSize);
}
input.mkhi.ki.dwFlags = KEYEVENTF_KEYUP;
for (int i = keys.Count - 1; i >= 0; --i)
{
input.mkhi.ki.wVk = keys[i];
SendInput(1, ref input, inputSize);
}
}
我在 Chrome 中突出显示 网络应用程序上的文本,并通过快捷键 运行 连接我的控制台应用程序。
当我突出显示 label 字段时,它有效(从两种方式)。
但是当我突出显示任何输入字段.[=13=时,它不起作用(无论是方法1还是方法2) ]
例如。我的 Web 应用程序有标签 Contact 2(上图),接下来是输入字段。当我突出显示 Lable 即 Contact2(通过双击)和 运行 我的控制台应用程序(通过按 shorkey)时,我得到突出显示的文本但是当我对输入字段执行相同操作时,我什么也得不到。
为什么 Chrome 正在接受 Copy commnad for label 但 不适用于输入 。
感谢任何帮助。
我有一个启用了计时器的示例应用程序。在定时器事件中,有如下代码:
private void timer1_Tick_1(object sender, EventArgs e)
{
SendKeys.SendWait("^c");
Application.DoEvents();
if (Clipboard.ContainsText())
{
var lText = Clipboard.GetText();
textBox1.AppendText(lText);
}
}
请注意使用小 "c" 而不是大写 "C",因为 Control+Shift+C 将触发 Chrome 中的开发人员工具。
这确实成功地在 Chrome 的网站的输入字段中打印了选定的文本。
如果这对您不起作用,我认为有两种可能性:
- 您尝试从密码字段中获取文本。这行不通。
- 您将焦点放在不同的应用程序(您自己的应用程序)上以触发您的代码,因此在您的代码执行时输入字段不是具有焦点的控件。
如果这确实有效,但您的方法无效,那么您触发代码的机制(使用某种形式的全局键盘快捷键)不起作用。可能是因为您使用的键盘快捷键已经被输入字段解释了。
我编写了一个小型控制台应用程序,它可以从 Web 应用程序复制突出显示的文本。 我正在尝试以两种方式做到这一点
1) 通过简单的 Sendkeys
SendKeys.SendWait("^C");
Application.DoEvents();
2) 通过 SendInput
Keyboard.SimulateKeyStroke('c', ctrl: true);
public static void SimulateKeyStroke(char key, bool ctrl = false, bool alt = false, bool shift = false)
{
List<ushort> keys = new List<ushort>();
if (ctrl)
keys.Add(VK_CONTROL);
if (alt)
keys.Add(VK_MENU);
if (shift)
keys.Add(VK_SHIFT);
keys.Add(char.ToUpper(key));
INPUT input = new INPUT();
input.type = INPUT_KEYBOARD;
int inputSize = Marshal.SizeOf(input);
for (int i = 0; i < keys.Count; ++i)
{
input.mkhi.ki.wVk = keys[i];
bool isKeyDown = (GetAsyncKeyState(keys[i]) & 0x10000) != 0;
if (!isKeyDown)
SendInput(1, ref input, inputSize);
}
input.mkhi.ki.dwFlags = KEYEVENTF_KEYUP;
for (int i = keys.Count - 1; i >= 0; --i)
{
input.mkhi.ki.wVk = keys[i];
SendInput(1, ref input, inputSize);
}
}
我在 Chrome 中突出显示 网络应用程序上的文本,并通过快捷键 运行 连接我的控制台应用程序。
当我突出显示 label 字段时,它有效(从两种方式)。
但是当我突出显示任何输入字段.[=13=时,它不起作用(无论是方法1还是方法2) ]
例如。我的 Web 应用程序有标签 Contact 2(上图),接下来是输入字段。当我突出显示 Lable 即 Contact2(通过双击)和 运行 我的控制台应用程序(通过按 shorkey)时,我得到突出显示的文本但是当我对输入字段执行相同操作时,我什么也得不到。
为什么 Chrome 正在接受 Copy commnad for label 但 不适用于输入 。
感谢任何帮助。
我有一个启用了计时器的示例应用程序。在定时器事件中,有如下代码:
private void timer1_Tick_1(object sender, EventArgs e)
{
SendKeys.SendWait("^c");
Application.DoEvents();
if (Clipboard.ContainsText())
{
var lText = Clipboard.GetText();
textBox1.AppendText(lText);
}
}
请注意使用小 "c" 而不是大写 "C",因为 Control+Shift+C 将触发 Chrome 中的开发人员工具。
这确实成功地在 Chrome 的网站的输入字段中打印了选定的文本。
如果这对您不起作用,我认为有两种可能性:
- 您尝试从密码字段中获取文本。这行不通。
- 您将焦点放在不同的应用程序(您自己的应用程序)上以触发您的代码,因此在您的代码执行时输入字段不是具有焦点的控件。
如果这确实有效,但您的方法无效,那么您触发代码的机制(使用某种形式的全局键盘快捷键)不起作用。可能是因为您使用的键盘快捷键已经被输入字段解释了。