无焦点窗口

talip1106 2017-02-01 02:21:51
求一个创建无焦点窗口的实现代码。。。。三天了,卡在这个问题上,创建时可以不抢夺焦点,但是鼠标点击后又获取焦点了。我现在需要的是一个类似输入法窗口一样的窗口,永远不抢夺焦点。网上搜了个遍,在窗口回调函数里也做了修改,可是没起作用,根本就没有获取到WM_MOUSEACTIVATE这个消息。代码如下:
procedure TForm1.WndProc(var m: TMessage);
begin
inherited;
case m.Msg of
WM_MOUSEACTIVATE:
begin
m.Result:=MA_NOACTIVATE;
exit;
end;
WM_ACTIVATE:
begin
m.Result:=MA_NOACTIVATE;
end;
end;
end;


窗口创建时用SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE);
可以实现窗口创建时不抢夺焦点。
...全文
900 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
santiaodahan 2017-02-03
  • 打赏
  • 举报
回复
楼主的代码只对窗体客户区有效,效果不是很好。可以通过修改窗体扩展风格来屏蔽焦点:

SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
或
procedure CreateParams(var Params: TCreateParams); override;
implementation
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
     inherited CreateParams(Params);
     Params.ExStyle := Params.ExStyle or WS_EX_NOACTIVATE;
end;
设置窗体Enabled属性为False可以屏蔽所有鼠标、键盘事件。
武稀松 2017-02-03
  • 打赏
  • 举报
回复
恰巧我之前做过输入法。 输入法窗口是Disabled的窗口,所以永远也无法获取焦点。 因为输入法窗口时Disabled所以无法正常处理鼠标的WM_MouseMove,WM_LButtonDown等消息,而处理的是WM_SETCURSOR消息,这个消息LParam的高位就是真正的鼠标消息比如WM_LBUTTONDOWN等等,鼠标的坐标要用GetCursorPos自己取。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧