怎样让鼠标移到窗口上就激活该窗口?

shiningstar 2002-01-29 05:51:50
如题.
...全文
473 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiningstar 2002-01-31
  • 打赏
  • 举报
回复
呵呵,昨天分没给出去,现在给出去了
fenglingdu 2002-01-30
  • 打赏
  • 举报
回复
关注。。。
binbin 2002-01-30
  • 打赏
  • 举报
回复
win9X开始对程序管得越来越严格了,不允许直接把窗口送到前面,而是让任务栏上的按钮闪烁。我前面说过了的,要做到这样,你必须在前台程序的进程中,所以我用了AttachThreadInput函数进入前台程序的进程,然后再把我们的程序窗口放上来。

好象没有拿到分啊,这个贴子该结了吧。
gfh21cn 2002-01-30
  • 打赏
  • 举报
回复
BringToFront()
SetFocus();
ydx 2002-01-30
  • 打赏
  • 举报
回复
不可能,mousemove事件在窗体不是active的时候也能发生,你们试过了,就相当然....
「已注销」 2002-01-30
  • 打赏
  • 举报
回复

声明 上贴无效 !Application->Active 偶没注意前面的 非 不好意思 浪费一个回复

void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Label1->Caption=X; //这个的确是可以的
//if(!Application->Active)//如果不进行判断 则会闪个不停 但判断了也没用
::SetFocus(Handle);//把焦点给它也没用
//SetForegroundWindow(Application->Handle);//放到最前也没用 仍然是灰色的
}

关注此问题

@_@
「已注销」 2002-01-30
  • 打赏
  • 举报
回复
to binbin() 

我没仔细试你写的代码 只是粗略的看了看

在这里我想问一下 你是先判断程序如果没失去焦点(不是窗口 是整个应用)

然后再处理的对吗 如果程序失去焦点了 怎么办呢 问的欠妥 还请耐心指点

@_@
aawolf 2002-01-30
  • 打赏
  • 举报
回复
我试了一下,首先如果窗体为灰色,MouseMove事件仍然触发,也可以把焦点设置在某个控件上,但Form1->SetFouce没用。
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
//Form1->SetFocus ();//不行
Button2->SetFocus ();//行
}
shiningstar 2002-01-30
  • 打赏
  • 举报
回复
你们的方法我都试了一遍,只有binbin()的方法是正确的,我给分了啊!
binbin 2002-01-29
  • 打赏
  • 举报
回复
如果你只是要激活同的程序的不同窗口,用Form1->Show()就行了,但如果你的整个程序都被InActive了,用我上面的方法。
binbin 2002-01-29
  • 打赏
  • 举报
回复
要激活另一进程的窗口,我用的方法是AttachThreadInput
binbin 2002-01-29
  • 打赏
  • 举报
回复
楼上的几位全错了,MouseMove消息无论是否激活都会发送到窗口,只要这个窗口正好是鼠标的下面的第一个窗口。大家可以测试一下下面的代码,看看Label1在窗口未激活时是否会变化:
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Label1->Caption=X;
}


我做过一个类似的东东,部分源码如下:

void __fastcall TPHPCmdr_Bin::Panel1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{ if(!Application->Active){
if(AutoActive->Checked){
long OtherThreadID=GetWindowThreadProcessId(GetForegroundWindow(),0);
long ThisThreadID=GetCurrentThreadId();
if(AttachThreadInput(ThisThreadID,OtherThreadID,true)){
::SetFocus(Handle);
AttachThreadInput(ThisThreadID,OtherThreadID,false);
}
}
}
}
kingxing 2002-01-29
  • 打赏
  • 举报
回复
以前WIN95的PowerToy有这各功能,应该是根据鼠标位置找到窗体句柄,然后设为激活
mopyman 2002-01-29
  • 打赏
  • 举报
回复
当窗体失去焦点时是不会感知OnMouseMove事件地
fiveyes 2002-01-29
  • 打赏
  • 举报
回复
窗口都不Active了,Windows还给它发送鼠标移动之类的消息吗?
学习。
ydx 2002-01-29
  • 打赏
  • 举报
回复
我试过了,没问题,给分吧。
「已注销」 2002-01-29
  • 打赏
  • 举报
回复



捕捉鼠标位置 用计时器

记住一点 当窗口不被激活的时候 鼠标在上面晃一百年也不会发生任何事件的

@_@
ydx 2002-01-29
  • 打赏
  • 举报
回复
用api函数BOOL SetForegroundWindow(

HWND hWnd // handle of window to bring to foreground
);可以把窗口激活,可在ONMOUSEMOVE 事件中。
shiningstar 2002-01-29
  • 打赏
  • 举报
回复
不是让窗口出现(窗口本来就有),是让窗口激活,就是让窗口的标题栏变成蓝色。
hello_wyq 2002-01-29
  • 打赏
  • 举报
回复
//nod
加载更多回复(1)

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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