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

shiningstar 2002-01-29 05:51:50
如题.
...全文
474 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)
如何设置让一个窗口总在最前(Exaware OnTop和PushPin)软件下载 Windows中打开一个新窗口或切换任务时,原有的活动窗口就会被它所覆盖。不过,像Winamp等软件,却有一个能让自己的操作窗口总在最前的功能,非常实用。其实,只要你安装了像ExaWare OnTop和PushPin这样的免费小软件,也一样可以让任意Windows操作窗口总在最前面,不让其他的窗口挡住它! 1.好用的ExaWare OnTop 下载并安装该软件后,双击桌面上的ExaWare OnTop 图标启动程序,我们看不到它的任何窗口界面,但在系统托盘上可以发现它的图标。单击该图标会弹出一个菜单,在这里列出了当前系统中所有窗口的标题。要想让某个窗口总在最前面,只要将鼠标移到相应的窗口标题项并点击鼠标(左右键均可)即可,如图所示。单击后该窗口标题前面的图标也相应地多了一个方框(如果没有图标则会显示一个对勾),表明该窗口已经设置成功。这时打开该窗口,再打开其他程序窗口,看看它是否一直总在其他窗口的前面而不被遮住?怎么样,是不是有种高高在上的感觉?要想取消 OnTop 状态,只要重复一遍上面的操作就可以了。 看到这里你是不是有一个疑问:如果同时将两个窗口设置为总在最前(Always OnTop)的状态,那将会发生什么事情呢?其实也很简单,如果两个(或多个)窗口同时处于总在最前的状态,那说明它们的地位平等,这时先激活谁谁就在最上面(和设置前一样看待)。另外还有一个问题需要注意:如果需要退出该软件,建议点击系统托盘上的软件图标并选择菜单中的“Exit and Restore”命令,这样在退出软件的同时可以恢复各个窗口的原始状态,以免给使用带来不便。 2.小巧的PushPin 相对于ExaWare OnTop 来说,PushPin 的体积更为小巧,只有区区的22KB 下载得到的是一个压缩包,由于它是一款绿色软件,我们只要直接将该压缩包解压缩到某个指定的目录下即可运行(主程序文件名为Pushpin.exe),同样看不到主程序窗口,只会发现系统托盘处多了一个图标。要想让某个操作窗口总在最前面,只要在其标题栏上(在任务栏按钮上也可)单击鼠标右键并从弹出的菜单中选择“Always on top”命令即可。要退出程序只需用鼠标右击系统托盘上的软件图标,并从弹出的菜单中选择“Remove”命令即可

13,871

社区成员

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

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