MDIChild窗体中不能使用Tab键切换焦点控件的问题。请高手解答

leonkim 2005-06-13 10:44:54
我用主程序调用Dll内的MDIChild子窗体,显示一切正常。当焦点在子窗体内的控件上时,按Tab键,焦点不动。请各位分析问题出现的原因,多谢。
Dll中的输出方法定义如下:
procedure ShowChild(pMainApp:Pointer);stdcall;
var
pForm:^TForm;
begin
Application.Handle:=TApplication(Pointer(pMainApp^)).Handle;
pForm:=@Application.MainForm;
pForm^:= TApplication(Pointer(pMainApp^)).MainForm;
fmMain:=TfmMain.Create(nil);
//*******************************
fmMain.FormStyle := fsMDIChild;
fmMain.WindowState := wsMaximized;//保证主窗体以最大化方法显示
//*******************************
fmMain.show;
end;
...全文
168 3 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
leonkim 2005-06-13
  • 打赏
  • 举报
回复
解决了,贴出来给大家共享:

TFmMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
//声明响应WM_HOTKEY消息的方法
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
function GetSysFocus: Integer;
public
procedure WMACTIVATEAPP(var Msg: TMessage); message WM_ACTIVATEAPP;
end;

implementation
const id_SnapShot = 115; //定义热键标识符


function TFmMain.GetSysFocus: Integer;
var
hOtherWin,OtherThreadID,hFocusWin:integer;
begin
hOtherWin:=GetForegroundWindow;
OtherThreadID:=GetWindowThreadProcessID(hOtherWin,nil);
if AttachThreadInput(GetcurrentThreadID,OtherThreadID,True) then
begin
hFocusWin:=GetFocus;
result:=GetFocus;
if HFocusWin<>0 then
try
SendMessage(GetFocus,WM_COPY,0,0);//书上是这么写的
finally
AttachThreadInput(GetcurrentThreadID,OtherThreadID,False);
end;
end
else result:=GetFocus;
end;

procedure TFmMain.WMHotKey(var Msg: TWMHotKey);
var
H: THandle;
begin
if Msg.HotKey = id_SnapShot then
begin
H := GetSysFocus;
while IsWindow(H) and (H <> Handle) do
begin
SendMessage(H,WM_NEXTDLGCTL,0,0);
H := GetParent(H);
end;
end;
end;


procedure TFmMain.WMACTIVATEAPP(var Msg: TMessage);
begin
if Boolean(Msg.WParam) then
RegisterHotKey(Handle, id_SnapShot, 0, VK_TAB) //定义热键 在程序得到焦点时
else
UnRegisterHotKey(Handle, id_SnapShot); //释放已经登记的热键 在程序失去焦点时
end;

procedure TFmMain.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, id_SnapShot, 0, VK_TAB) //定义热键 在程序得到焦点时
end;
leonkim 2005-06-13
  • 打赏
  • 举报
回复
TO : xthmpro_cn(安徽农民*在外打工)
项目早就开始了,
1、窗体每次调用比较麻烦。//调用只在主程序中写一次就行了,也不是太麻烦
2、Tab键转换处问题 //在网上查不到,可能是查的方法不对,请指教
3、不能显示子窗体的Hint。否则出错。(需要修改VCL代码)//使用我上边写的方法,显示可以显示Hint
4、使用第三方空间出错。已知的有:cxGrid //这个项目原则上不使用第三方控件

Tab键转换出问题 //在网上查不到,可能是查的方法不对,请指教
xthmpro_cn 2005-06-13
  • 打赏
  • 举报
回复
这个比较难,网上有处理的办法,但是,我建议还是改用BPL运行包吧(如果项目才开始的话)。
1、窗体每次调用比较麻烦。
2、Tab键转换处问题
3、不能显示子窗体的Hint。否则出错。(需要修改VCL代码)
4、使用第三方空间出错。已知的有:cxGrid
5...

所以建议改用BPL包。我就是改了。
发帖
Windows SDK/API

1174

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2005-06-13 10:44
社区公告
暂无公告