C剪贴板更新很慢
Posted
技术标签:
【中文标题】C剪贴板更新很慢【英文标题】:C Clipboard updating very slow 【发布时间】:2015-11-01 18:25:27 【问题描述】:我想监控给另一个应用程序的关键事件,每当按下 ctrl+d 时,发送 ctrl+c,抓取(新)剪贴板内容并根据它执行其他操作。
我的代码:
void PressKeyboardKey(char key)
INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wVk = key;
ip.ki.wScan = 0;
ip.ki.dwFlags = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
SendInput(1, &ip, sizeof(INPUT));
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
char pressedKey;
// Declare a pointer to the KBDLLHOOKSTRUCTdsad
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
switch( wParam )
case WM_KEYUP:
pressedKey = (char)pKeyBoard->vkCode; //get the key code
if ((pressedKey == -94) || (pressedKey == -93)) //Ctrl
CtrlPressed = FALSE;
else if (pressedKey == 68) //d
if (CtrlPressed && IsTargetApplicationActive())
PressKeyboardKey(67); //c
//Read from Clipboard
Sleep(CLIPBOARD_SLEEP_TIME);
HANDLE h;
if (!OpenClipboard(NULL))
break; //abort
h = GetClipboardData(CF_TEXT);
const char* output = evaluateItem((char*)h); // For now prints the content of the clipboard
Sleep(ADDITIONAL_SLEEP_TIME); //Ususally not there, added just for testing
CloseClipboard();
.....
如果 CLIPPBOARD_SLEEP_TIME >= 350(最小值),一切都会按预期进行,对于一个良好的工作流程来说,时间太长了。否则,我只会得到旧的剪贴板内容。
我的第一个猜测是,目标应用程序填充剪贴板的速度非常慢,但是下面的 ahk 脚本:
^d::
Send, ^c
MsgBox, %clipboard%
似乎是瞬时的。 因此必须有一种更快的方法来抓取剪贴板的内容。
任何人都知道如何在 C 中做到这一点 - 我做错了什么?
【问题讨论】:
键盘输入被缓冲,您不知道目标应用程序何时从消息队列中检索击键。没有合理的上限,当应用程序被换出内存时可能需要 秒。显然你做错了,其他的更好。不限于 SendMessageTimeout() 发送 WM_COPY 消息和使用 UI 自动化。 哇,SendMessage 真的很神奇。我使用 SendInput 的原因,是不是在寻找“发送键盘按 c”时在谷歌中弹出的东西 - 不知道这是一个坏主意。 我假设这是 Windows。添加该关键字会很有帮助。 【参考方案1】:你必须使用SetClipboardViewer()
,不要使用Sleep()
【讨论】:
以上是关于C剪贴板更新很慢的主要内容,如果未能解决你的问题,请参考以下文章
C#winform 剪贴板中的EXCEL文档,存入datatable中
python 带有Python 3更新的HTMLClipboard包括锁定剪贴板的异常处理。改进:http://code.activestate.com/recip