微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定聚焦的窗口是否具有活动的插入符号

如何解决确定聚焦的窗口是否具有活动的插入符号

以下_isEdit函数检测是否可以将输入应用于当前关注的控件:

class function TSpeedInput._getFocusedControlClassName(): WideString;
var
  lpClassName: array[0..1000] of WideChar;
begin
  FillChar(lpClassName,SizeOf(lpClassName),0);
  Windows.GetClassNameW(GetFocus(),PWideChar(@lpClassName),999);
  Result := lpClassName;
end;

class function TSpeedInput._isEdit(): Boolean;
const
  CNAMES: array[0..3] of string = ('TEdit','TMemo','TTntMemo.UnicodeClass','TTntEdit.UnicodeClass');
var
  cn: WideString;
  i: Integer;
begin
  Result := False;
  cn := _getFocusedControlClassName();
  for i := Low(CNAMES) to High(CNAMES) do
    if cn = CNAMES[i] then begin
      Result := True;
      Exit;
    end;
  //MessageBoxW(0,PWideChar(cn),nil,0);
end;

我不喜欢的是类名称列表的硬编码。是否可以检测到当前聚焦的窗口属于编辑器家族,或者更确切地说,它具有活动的插入符号? (为了使_isEdit返回False处于只读模式的 WhatItItsControl )。

解决方法

如果您感兴趣的控件位于特定的表单上,并且属于该表单(并且是标准的Delphi控件),则可以使用以下命令:

function TFormML2.FocusIsEdit: boolean;
var
  i : integer;
begin
  Result := FALSE;
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[ i ] is TCustomEdit then
    begin
      if (Components[ i ] as TCustomEdit).Focused and not (Components[ i ] as TCustomEdit).ReadOnly  then
      begin
        Result := TRUE;
        break;
      end;
    end;
  end;
end;

如果您知道表格并可以将其作为参数传递,则可以执行类似的操作。

TCustomEdit是所有编辑框,备忘录等的始祖。

,

如果分配了控件的Handle,则可以使用此技巧:

function IsEdit(AControl: TWinControl): boolean;
begin
    if AControl.HandleAllocated then
    begin
        Result := SendMessage(AControl.Handle,EM_SETREADONLY,WPARAM(Ord(AControl.Enabled)),0) <> 0;
    end
    else
    begin
        Result := AControl is TCustomEdit;
    end;
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。