Delphi 向其他应用程序发送文本

Delphi 向其他应用程序发送文本,delphi,clipboard,copy-paste,sendmessage,Delphi,Clipboard,Copy Paste,Sendmessage,我有一个字符串变量。现在我想将字符串值存储到另一个应用程序中的控件中,而不使用剪贴板。我想手工做 我想我应该使用SendMessage(WM_SETTEXT)。您建议采用哪种方式(请举例)?因为您的应用程序知道它必须发送的字符串 如果需要,可以将焦点设置为目标窗口/应用程序 然后处理字符串中包含的每个字符以模拟它们的按键。类似的东西(太基本了,无法完全按照您的预期工作,但想法就在这里……;o)): 如果字符串大写,…,则需要模拟shift、ctrl、…使用keybd\u事件输入多字节字符: pr

我有一个字符串变量。现在我想将字符串值存储到另一个应用程序中的控件中,而不使用剪贴板。我想手工做


我想我应该使用SendMessage(WM_SETTEXT)。您建议采用哪种方式(请举例)?

因为您的应用程序知道它必须发送的字符串

如果需要,可以将焦点设置为目标窗口/应用程序

然后处理字符串中包含的每个字符以模拟它们的按键。类似的东西(太基本了,无法完全按照您的预期工作,但想法就在这里……;o)):


如果字符串大写,…,则需要模拟shift、ctrl、…

使用keybd\u事件输入多字节字符:

procedure InsertText(text:string);
var i:integer;
    j:integer;
    ch:byte;
    str:string;
begin
  i:=1;
  while i<=Length(text) do
  begin
    ch:=byte(text[i]);
    if Windows.IsDBCSLeadByte(ch) then
       begin
         Inc(i);
         str:=inttostr(MakeWord(byte(text[i]), ch));
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
         j:=1;
         while j<=Length(str) do
         begin
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 0, 0);
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 2, 0);
               j:=j+1;
         end;
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
       end
    else begin
           keybd_event(VkKeyScan(text[i]),0,0,0);
           keybd_event(VkKeyScan(text[i]),0,2,0);
         end;
    Inc(i);
  end;
end;
过程插入文本(文本:字符串);
varⅠ:整数;
j:整数;
ch:字节;
str:字符串;
开始
i:=1;

而IDE依赖于其他应用程序。它是哪个应用程序?你的目标是应用程序中的哪个控件?好的,那么你实际上不想粘贴任何严格意义上的东西,也就是说,使用剪贴板?每个应用程序都可能有不同的解决方案。该应用程序中的每个控件可能需要不同的处理。@Kermia不,它的工作方式是这样的。按CTRL+V,系统将合成键盘输入消息,这些消息将放置在前台线程的输入队列中。连接到该线程的消息泵随后处理这些按键。这通常涉及将WM_粘贴消息传递到窗口控件。Windows不会粘贴。具有输入焦点的应用程序收到一条消息,用户按下CTRL+V,然后选择从剪贴板读取,解释其内容,并做出相应的响应。在我看来,发送键是最可靠的方法。@Kermia这相当于您已经拥有的发送键。@Marjan我向代码发送了“Hello”,输出为:“h5/”。为什么?它与HELLO一起工作……而不是与小写字符一起工作……您必须管理它……是否有一个处理小写和大写字符的现成类?在我看来,这比(ab)使用剪贴板要好得多。
procedure InsertText(text:string);
var i:integer;
    j:integer;
    ch:byte;
    str:string;
begin
  i:=1;
  while i<=Length(text) do
  begin
    ch:=byte(text[i]);
    if Windows.IsDBCSLeadByte(ch) then
       begin
         Inc(i);
         str:=inttostr(MakeWord(byte(text[i]), ch));
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
         j:=1;
         while j<=Length(str) do
         begin
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 0, 0);
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 2, 0);
               j:=j+1;
         end;
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
       end
    else begin
           keybd_event(VkKeyScan(text[i]),0,0,0);
           keybd_event(VkKeyScan(text[i]),0,2,0);
         end;
    Inc(i);
  end;
end;