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

Delphi 确定聚焦窗口是否有活动插入符号,delphi,winapi,controls,caret,delphi-6,Delphi,Winapi,Controls,Caret,Delphi 6,以下\u isEdit功能检测输入是否可应用于当前聚焦的控件: class function TSpeedInput._getFocusedControlClassName(): WideString; var lpClassName: array[0..1000] of WideChar; begin FillChar(lpClassName, SizeOf(lpClassName), 0); Windows.GetClassNameW(GetFocus(), PWideChar(

以下
\u 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;

我不喜欢的是类名列表的硬编码。是否可以检测到当前聚焦的窗口属于编辑器系列,或者更确切地说,它有一个活动的插入符号?(为了使
\u isEdit
对于处于只读模式的WhateverItIsControl返回
False

如果您感兴趣的控件位于特定窗体上,并且属于该窗体(并且是标准的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是所有编辑框、备忘录等的前身。

如果您感兴趣的控件位于特定窗体上,并且属于该窗体(并且是标准的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是所有编辑框、备忘录等的祖先。

如果控件的
句柄已分配,则可以使用此hack:

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;
函数IsEdit(AControl:TWinControl):布尔值;
开始
如果已分配控制手柄,则
开始
结果:=SendMessage(AControl.Handle,EM_SETREADONLY,
WPARAM(Ord(已启用控制)),0)0;
终止
其他的
开始
结果:=A控制为TCustomEdit;
终止
终止

如果控件的
句柄
已分配,则可以使用此破解:

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;
函数IsEdit(AControl:TWinControl):布尔值;
开始
如果已分配控制手柄,则
开始
结果:=SendMessage(AControl.Handle,EM_SETREADONLY,
WPARAM(Ord(已启用控制)),0)0;
终止
其他的
开始
结果:=A控制为TCustomEdit;
终止
终止

查看:只读控件可以显示插入符号。事实上,它通常是这样做的,所以你可以复制文本。无论如何,你可以尝试隐藏插入符号。如果成功,请再次显示并注意有插入符号显示。请看:只读控件可以显示插入符号。事实上,它通常是这样做的,所以你可以复制文本。无论如何,你可以尝试隐藏插入符号。如果成功,请再次显示,并注意显示了插入符号。注意:(1)这将只查找
TFormML2
所拥有的控件。此表单很可能包含不属于它的控件。(2) 使用
FindControl
功能不是更容易吗?(3) 并非所有编辑控件都源自
TCustomEdit
。例如,我自己的
TTextEditor
来自
TCustomControl
@andreasrejband,谢谢您的评论。我知道这可能不是OP想要的,但可能也是。例如,他确实特别要求知道它是否是只读的。但我同意,这是我的看法。只有从TCustomEdit派生的所有Delphi VCL本机控件。我想我已经提到表单必须拥有控件,但是回过头来看,我发现我没有。我将编辑..OP使用
Application.OnMessage
,因此编辑控件可以是任何形式。我只有一个句柄。注意:(1)这将只查找
TFormML2
所拥有的控件。此表单很可能包含不属于它的控件。(2) 使用
FindControl
功能不是更容易吗?(3) 并非所有编辑控件都源自
TCustomEdit
。例如,我自己的
TTextEditor
来自
TCustomControl
@andreasrejband,谢谢您的评论。我知道这可能不是OP想要的,但可能也是。例如,他确实特别要求知道它是否是只读的。但我同意,这是我的看法。只有从TCustomEdit派生的所有Delphi VCL本机控件。我想我已经提到表单必须拥有控件,但是回过头来看,我发现我没有。我将编辑..OP使用
Application.OnMessage
,因此编辑控件可以是任何形式。我只有一个把手。