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
,因此编辑控件可以是任何形式。我只有一个把手。