SendMessage到Firefox,光标位置

时间:2011-10-13 10:15:26

标签: delphi winapi

以下代码有时会起作用:它会插入来自tEdit的文字,但仅限于"记事本"," Word"," ICQ"。像Firefox或Google Chrome这样的软件并不适用。 我该怎么办?

 var
  Pos: TPoint;
  Target: HWND;
...
if not GetCursorPos(Pos) then
  RaiseLastOSError;
Target := WindowFromPoint(Pos);
if Target<>0 then
  SendMessage(Target, EM_REPLACESEL, ord(True), LPARAM(PChar(Edit1.Text)));

那就是它!我找到了我需要的代码

procedure SendText(ds:string);
var
TI: TInput;
KI: TKeybdInput;
i: integer;
begin
TI.Itype := INPUT_KEYBOARD;
for i := 1 to Length(ds) do
begin
KI.wVk := Ord(UpCase(ds[i]));
KI.dwFlags := 0;
TI.ki := KI;
SendInput(1, TI, SizeOf(TI));
KI.dwFlags := KEYEVENTF_KEYUP;
TI.ki := KI;
SendInput(1, TI, SizeOf(TI));
end;
end;

但问题是 - 我无法使用SendInpit(Edit1.Text)复制俄语(cyrilic)符号;有什么建议?

3 个答案:

答案 0 :(得分:3)

它在Firefox和Chrome中不起作用,因为您在其中看到的编辑框由浏览器中的HTML引擎呈现,而不是由操作系统呈现。它们被称为“windowless controls”,因此没有与它们关联的窗口句柄。

就操作系统而言,网页是一个大的HWND,其中有一个网页,由于HTML引擎,一些绘制的元素恰好看起来像控件一样。< / p>

您无法使用SendMessage()定位此类控件。根据您计划要做的事情,可能有另一种更直接的方式来自动化浏览器。但使用SendMessage()绝对不是可行的方法。

答案 1 :(得分:1)

AFAIR,Firefox编辑框并不是真正的Windows原生编辑框,而是一些不同的东西。 我可能是错的,但你不能把它当作普通的编辑盒。你需要得到他们的窗口 handle(好吧,如果他们有一个窗口句柄)并将消息发送给它。

我说的是Firefox(地址栏和搜索栏)的编辑框本身而不是那些 用HTML渲染。

Windows Platform SDK(从Microsoft下载)上有一些实用程序可以帮助您识别 SendMessage调用的正确目标。

答案 2 :(得分:1)

您可以使用MSAA执行此操作。下面是一个例子:http://www.transl-gunsmoker.ru/2009/08/blog-post.html在WinSDK中有一个类似于WinSpy的MSAA,叫做AccExplorer32。