如何在delphi中从前台窗口中读取鼠标选中的单词而不使用剪贴板

时间:2014-08-11 11:00:20

标签: delphi winapi

任何人都可以使用任何窗口api或其他任何东西给我代码从delphi中的前景窗口读取鼠标选中或突出显示的文本。 这是我的代码我发送按键ctrl + c读取到剪贴板,然后从中读取

handltForForeGroundWindow := GetForegroundWindow ;
PostMessage(handltForForeGroundWindow , wm_keydown, VK_CONTROL, 0);
PostMessage(handltForForeGroundWindow , wm_keydown, VkKeyScan('c'), 0);
Sleep(40);
PostMessage(handltForForeGroundWindow , wm_keyup, VkKeyScan('c'), 0);
PostMessage(handltForForeGroundWindow , wm_keyup, VK_CONTROL, 0);
StoreWord := Clipboard.AsText;  // variable to read clipboard content 

1 个答案:

答案 0 :(得分:0)

对问题中代码的批评:

  1. SendInput是此处使用的正确API。它将输入消息放入活动窗口的队列中。您可以创建四个键盘事件的数组,并将它们放入原子操作队列中。
  2. Sleep的来电是错误的。为什么要在发布更多输入之前等这只会增加其他人因某些干扰输入而受阻的机会。当然,这正是SendInput的全部内容。
  3. 您需要为其他应用程序提供处理输入的机会。发送输入足够长的时间后,您必须等待响应。它需要多长时间?谁能说出来?这是您策略的主要弱点。没有可靠的方法让你知道你需要等多久。太短了,应用程序不会完成太长时间,其他人(即实际拥有剪贴板的用户)可能已经覆盖了您正在寻找的文本。
  4. 销毁用户的剪贴板可能会让您的程序用户讨厌它。我想你已经知道了。
  5. 关于如何正确地执行此操作,而不使用剪贴板,您确实应该使用自动化API执行此任务。这是你上一个问题的主题:I want to read Mouse selected text from foreground window without using clipboard而且我不确定这个问题有什么不同。