gpt4 book ai didi

c# - 启动复制/粘贴事件不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:12 25 4
gpt4 key购买 nike

[代码上下文]

大家好,

我正在开发一个应用程序,该应用程序通过发送键盘事件来按下 C 键和 Ctrl 键来启动复制或粘贴事件。

我实际上用这种方法发送 Kb 事件:

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

public static void PressKey(Keys key, bool up)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
if (up)
{
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
}
else
{
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
}
}

调用:

private void launchCopy()
{
PressKey(Keys.ControlKey, false);
PressKey(Keys.C, false);
PressKey(Keys.C, true);
PressKey(Keys.ControlKey, true);
}

并使用静态方法获取结果:

System.Windows.Forms.Clipboard.GetText()

用户必须使用鼠标按下其他键才能启动此事件,因此我使用 SFML 使用函数 Keyboard.IsKeyPressed(Keyboard.Key key); 取回用户操作来自 SFML 2.0。

我创建了一个等待用户事件的无限循环,然后启动副本并处理副本数据。 这段代码工作正常然后我用一些窗口创建了另一个 WPF 解决方案,我正在使用 NotifyIcon .加载主窗口后,使用循环方法创建一个线程(在用户事件 -> launchCopy 上)。

[调试]

当用户按下复制事件时,调用 PressKey 方法,但 ClipBoard.GetText() 方法返回空字符串。使用 SFML 我检查了键是否真的被按下了

  private void PrintState ()
{
Console.WriteLine(Keyboard.IsKeyPressed(Keyboard.Key.C) &&
(Keyboard.IsKeyPressed(Keyboard.Key.LControl) ||
Keyboard.IsKeyPressed(Keyboard.Key.RControl)));
}

private void launchCopy()
{
PrintState ();
PressKey(Keys.ControlKey, false);
PressKey(Keys.C, false);
PrintState ();
PressKey(Keys.C, true);
PressKey(Keys.ControlKey, true);
PrintState ();
}

输出是:

False True False

应该是这样吧

[问题]

为什么快捷复制模拟在这个应用程序上不起作用?从工作代码我:

  • 将代码放在另一个线程中
  • 1 其他线程但相同的应用程序:WPF windows + NotifyIcon图书馆

是否可能与 WPF 发生冲突?或者在另一个线程中使用 PrintState 方法时出现问题?

我迷失了调试这个。

任何帮助或想法将不胜感激

谢谢。

最佳答案

永远不会太晚。

这个 thread 解决了我的问题, 这不是发送事件,问题是检索剪贴板数据。

这是我用来从另一个线程使用剪贴板的代码:

public static class fastClipboard
{
[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("user32.dll")]
static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);
[DllImport("user32.dll")]
static extern bool IsClipboardFormatAvailable(uint format);
[DllImport("user32.dll", SetLastError = true)]
static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", SetLastError = true)]
static extern bool CloseClipboard();
[DllImport("kernel32.dll")]
static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll")]
static extern bool GlobalUnlock(IntPtr hMem);

const uint CF_UNICODETEXT = 13;

public static bool SetText(string data)
{
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
return false;
if (!OpenClipboard(IntPtr.Zero))
return false;

var ptr = Marshal.StringToHGlobalUni(data);
var res = SetClipboardData(CF_UNICODETEXT, ptr);
CloseClipboard();
if (res != IntPtr.Zero)
return true;
else
return false;
}

public static string GetText()
{
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
return null;
if (!OpenClipboard(IntPtr.Zero))
return null;

string data = null;
var hGlobal = GetClipboardData(CF_UNICODETEXT);
if (hGlobal != IntPtr.Zero)
{
var lpwcstr = GlobalLock(hGlobal);
if (lpwcstr != IntPtr.Zero)
{
data = Marshal.PtrToStringUni(lpwcstr);
GlobalUnlock(lpwcstr);
}
}
CloseClipboard();
return data;
}
}

关于c# - 启动复制/粘贴事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751207/

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