在Win98下怎样将某个窗口提到最前面?

qianxh 2000-07-25 10:04:00
本人的一个程序,通过对该程序的鼠标和键盘事件的Hook设置,进行超时处理,即:在任何一个功能界面,如果用户长时间无操作,则退出所有窗口直到该程序的主界面(登录前状态).为此,本人在所有窗口的基类里增加一个Action(快捷键Esc)和一个超时事件处理,当接到超时事件时,先将本窗口放到最前面,再用kb_event模拟一个Esc键(对Esc键的响应并不是每个窗口都只是简单的关闭自己,如某些询问窗口需要返回询问的结果).
问题:本人用SetForegoundWindow API 在 Windows 95/97 下运行正常,在 Windows 98 下不能达到目的,何故?
...全文
250 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianxh 2000-10-14
  • 打赏
  • 举报
回复
回dearmite: 我并不想要窗口始终停留在最前面,这样会影响其他应用程序(如无其它应用程序则本问题无提出的必要)。
--------------------------------------------------------------------------------
回zgc: 在问题中已说明,之所以模拟Esc键,是因为并非每个窗口都是简单关闭,如一些条件输入窗口要根据用户选择“确认”或“取消”来向父窗口返回值,以便父窗口决定是否执行相应的操作(简言之,在关闭窗口之前可能会对一些名称不尽相同的变量赋值)。
--------------------------------------------------------------------------------
另:因本人的开发机是Windows97,因此很多建议不方便尝试,以致久无回音,请各位多多原谅;
另外麻烦各位能回答得肯定一些,本人决不吝啬分数。谢谢!谢谢!!谢谢!!!
  • 打赏
  • 举报
回复
我说老兄,用TCustomForm 不行吗。
custom Form有个form style =fsStayOnTop
zgc 2000-10-08
  • 打赏
  • 举报
回复
既然SetForegroundWindow(Handle),不起作用,请式式:
SetWindowPos hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE Or SWP_NOSIZE;

但我想你要做的效果根本不需kb_event模拟Esc键退出。因为你已有窗口的句柄,用
SendMessage(hWnd,WM_CLOSE,0,0);就可关闭窗体了。
westsword 2000-08-09
  • 打赏
  • 举报
回复
用下面的试一下:
hWnd是要设的窗口.

DWORD dwThreadId = GetWindowThreadProcessId(hWnd, NULL);
DWORD dwActiveThreadId = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
AttachThreadInput(dwThreadId, dwActiveThreadId, TRUE);
BringWindowToTop(hWnd);
SetForegroundWindow(hWnd);
BringWindowToTop(hWnd);
AttachThreadInput(dwThreadId, dwActiveThreadId, FALSE);
qianxh 2000-08-09
  • 打赏
  • 举报
回复
其实我的意思就是想要找一个SetForegroudWindow的对应函数,我也知道该函数在Help里的Quick Info下Win32s为no.
westsword 2000-08-09
  • 打赏
  • 举报
回复
sdk中有下面一段话:

Windows 98, Windows 2000: The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
Windows 2000: No menus are active.

针对这些条件进行处理。
qianxh 2000-08-09
  • 打赏
  • 举报
回复
好像不行呢!
sztanj 2000-08-09
  • 打赏
  • 举报
回复
ShowWindow(Form1->Handle,SW_SHOW);
SetForegroundWindow(Form1->Handle);
bobar 2000-07-26
  • 打赏
  • 举报
回复
或者API中的SetWindowPos
wxz 2000-07-26
  • 打赏
  • 举报
回复
以下均可
1.用该窗口的SetFocus()方法
2.用ShowWindow函数

13,824

社区成员

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

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