首页 > 其他分享 >delphi 获取有输入焦点的活动窗口信息

delphi 获取有输入焦点的活动窗口信息

时间:2023-03-04 18:11:56浏览次数:58  
标签:GUITHREADINFO 窗口 mmo1 wintext delphi Lines Add rcCaret 输入

var
 wintext: array[0..MAXBYTE] of Char;
 WdChar: array[0..1] of char;
 focuswhd: THandle;
 processId: Pointer;
 threadid: Cardinal;
 GUITHREADINFO:TGUIThreadInfo;
 cp: TPoint;
 str:string;
begin
 //https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/ns-winuser-guithreadinfo
 threadid := GetWindowThreadProcessId(0, nil); //0获取当前最顶级的那个窗口
 GUITHREADINFO.cbSize := SizeOf(GUITHREADINFO);
 if GetGUIThreadInfo(threadid, GUITHREADINFO) then
 begin
  if GUITHREADINFO.hwndCaret > 0 then
  begin
   if GUITHREADINFO.flags = GUI_CARETBLINKING then //当 flags == 1 时,说明当前窗口中有闪烁的插入符,也就说明当前系统具有输入焦点,处于可输入状态。
   begin
    if not AttachThreadInput(threadid,GetCurrentThreadId,True) then //共享线程,不然取不到光标输入位置处的句柄
     mmo1.Lines.Add('AttachThreadInput失败');
    mmo1.Clear;
    FillChar(wintext,SizeOf(wintext),#0);
    GetWindowText(GUITHREADINFO.hwndActive,wintext, MAXBYTE);
    mmo1.Lines.Add('线程中活动窗口的句柄:'+IntToStr(GUITHREADINFO.hwndActive)+' text:'+wintext);
    FillChar(wintext,SizeOf(wintext),#0);
    GetWindowText(GUITHREADINFO.hwndFocus,wintext, MAXBYTE);
    mmo1.Lines.Add('具有键盘焦点的窗口的句柄:'+IntToStr(GUITHREADINFO.hwndFocus)+' text:'+wintext);
    FillChar(wintext,SizeOf(wintext),#0);
    GetWindowText(GUITHREADINFO.hwndCaret,wintext, MAXBYTE);
    mmo1.Lines.Add('显示插入点的窗口的句柄:'+IntToStr(GUITHREADINFO.hwndCaret)+' text:'+wintext);
    mmo1.Lines.Add('rect:'+Format('left:%d,top:%d,right:%d,Bottom:%d, Topleft:%d,%d,BottomRight:%d,%d',
             [GUITHREADINFO.rcCaret.Left,GUITHREADINFO.rcCaret.Top,GUITHREADINFO.rcCaret.Right,GUITHREADINFO.rcCaret.Bottom,
             GUITHREADINFO.rcCaret.TopLeft.X,GUITHREADINFO.rcCaret.TopLeft.Y,
             GUITHREADINFO.rcCaret.BottomRight.X,GUITHREADINFO.rcCaret.BottomRight.Y]));
    mmo1.Lines.Add(Format('光标位置:%d,%d',[GUITHREADINFO.rcCaret.Left,GUITHREADINFO.rcCaret.Top]));

    if GetCaretPos(cp) then
     mmo1.Lines.Add(Format('GetCaretPos:光标位置:%d,%d',[cp.X,cp.Y]));
     if GetCursorPos(cp) then
     mmo1.Lines.Add(Format('GetCursorPos:光标位置:%d,%d',[cp.X,cp.Y]));
//    str := wintext+'程序插入的'; //这种方式光标位置不正确  需要处理光标位置,速度太快可能会闪烁
//    SendMessage(GUITHREADINFO.hwndCaret, WM_SETTEXT, 0, LPARAM(str));
 // 用复制的方式  最好是先保存一下当前剪切板的内容后面再还原回去
//    Clipboard.AsText := '程序插入';
//    PostMessage(GUITHREADINFO.hwndCaret,WM_PASTE,0,0);
//    Clipboard.AsText := '';
    //这种方式则不用处理光标
    WdChar := '中';
    PostMessage(GUITHREADINFO.hwndCaret, WM_CHAR, Ord(wdchar[0]) ,0);
    PostMessage(GUITHREADINFO.hwndCaret, WM_CHAR, Ord(wdchar[1]) ,0);
   end;
  end
  else
   mmo1.Lines.Add('没有存在输入状态的窗口');
 end
 else
  mmo1.Lines.Add(SysErrorMessage(GetLastError));

 

标签:GUITHREADINFO,窗口,mmo1,wintext,delphi,Lines,Add,rcCaret,输入
From: https://www.cnblogs.com/BTag/p/17178750.html

相关文章

  • 从输入URL到Web页面呈现的全过程
    当用户在浏览器的地址栏中输入URL并点击回车后,页面是如何呈现的。简单来说,当用户在浏览器的地址栏中输入URL并点击回车后,浏览器从服务端获取资源,然后将内容显示在页面......
  • delphi 在cxgrid中展示物料各自的显示精度
    效果图:  数据库设计:  设计视图:  方法一使用TcxEditRepository控件.双击TcxEditRepository控件,进行添加.这里选择新增货币格式.  为每一种样式设置......
  • vueCli3--父子窗口之间通信
    demo-father.vue<template> <div>  <button@click="openNewWindow">点击开新窗口</button>  <button@click="closeSonWin">关闭子窗口</button> ......
  • 无感知WPF窗口
    在窗口的XAML文件中添加以下属性:ShowInTaskbar="False"这将使窗口不显示在任务栏上,并且不会出现在Alt+Tab切换列表中。在窗口的代码中,覆盖OnSourceInitialized方......
  • delphi 使用TFlowPanel容器,实现对内含控件进行自动排版
    效果图:   需求:当用户新增或者删除控件时,后面的控件(如果有的话)自动后退或者前移实现:需要用的控件是TFlowPanel,临时演员是TscGPEdit1.TFlowPanel设置......
  • delphi 自定义cxGrid的导航面板
    效果图  面板设置:1.把导航面板显示出来:Navigator.visible:=true 2.在Navigator-Buttons下设置自己需要显示或者隐藏的按钮  3.添加自定义按钮  双......
  • 命令行中输入 ASCII 字符
    十进制ASCII码为0~31的字符为控制字符,ASCII码为32~127的字符为可打印字符。在命令行中,控制字符按下表中的组合键输入,可打印字符直接按对应字符键输入(键略)。......
  • 两数之和 II - 输入有序数组(数据结构和算法两种实现方式)
    题目:给你一个下标从1开始的整数数组numbers,该数组已按非递减顺序排列,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[ind......
  • 告别手动拆图输入BOM,提高效率200%的方法,推进制造业自动化
    信息技术已成为现代产业变革升级的发动机,大型装备制造业要在数字经济时代浪潮中保持话语权,必须逐步实现数智化、助力企业转型升级。经过几年的信息化建设,目前某大型装备制造......
  • EAS客户端修改新增或编辑窗口为弹窗或者新的tab页签
    @OverrideprotectedStringgetEditUIModal(){returnUIFactoryName.EDITWIN;//UIFactoryName.NEWWIN为弹窗模式//UIFactoryName.NEWTAB......