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

qianxh 2000-07-25 10:04:00
本人的一个程序,通过对该程序的鼠标和键盘事件的Hook设置,进行超时处理,即:在任何一个功能界面,如果用户长时间无操作,则退出所有窗口直到该程序的主界面(登录前状态).为此,本人在所有窗口的基类里增加一个Action(快捷键Esc)和一个超时事件处理,当接到超时事件时,先将本窗口放到最前面,再用kb_event模拟一个Esc键(对Esc键的响应并不是每个窗口都只是简单的关闭自己,如某些询问窗口需要返回询问的结果).
问题:本人用SetForegoundWindow API 在 Windows 95/97 下运行正常,在 Windows 98 下不能达到目的,何故?
...全文
251 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函数
代码静态分析工具PC-LINT安装配置 PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误。 C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来了代码编写的隐患。PCLint识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误。这样消除错误的成本更低。 使用PC-Lint在代码走读和单元测试之前进行检查,可以提前发现程序隐藏错误,提高代码质量,节省测试时间。并提供编码规则检查,规范软件人员的编码行为。 由于PC-LINT对于一般程序员来说可能比较陌生,有好多人安装了也不知道怎样配置和使用。 下面我就根据自己的安装和配置心得对PC-Lint的安装、配置及使用进行下详细说明.本人主要介绍了将PC-Lint集成到VC++6.0和SourceInsight的方法和步骤。 (一)Windows下C/C++开发工具中,VC6使用较为普遍,因此这里先讲下VC6.0环境中集成pclint的步骤. 首先, 当然要下载软件,正版软件要200多$呢,买不起!所以只好网上找免费的拉。从http://www.61ic.com/down/othe/pclint.rar处可以下载到一个8.0版本的pclint. 1.将pclint.rar解压至c:\, 这样lint文件就位与c:\pclint(安装目录)下了。 2.将c:\pclint\lnt 下的3个文件lib-w32.lnt,env-vc6.lnt,co-msc60.lnt拷贝至c:\pclint下, 再在安装目录下创建std.lnt和options.lnt两个文件,其中std.lnt的内容如下 // contents of std.lnt c:\pclint\co-msc60.lnt c:\pclint\lib-w32.lnt c:\pclint\options.lnt -si4 -sp4 -i"D:\Program Files;D:\Program Files\Microsoft Visual Studio\VC98\Include" //end 其中-i后面的路径名为VC的安装路径和VC Include 文件路径,根据自己的修改便可。 options.lnt 内容可为空,为定制内容,以后需要时再添加。 准备工作做完了,下一步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C++文件进行检查。 1.打开VC6,tools--->customize-->tools 新建一个名为pclint的项,在下面填入 command: C:\pclint\lint-nt.exe arguments: -u c:\pclint\std.lnt c:\pclint\env-vc6.lnt "$(FilePath)" Use Output Window 打上勾 close 完成。 这个在你VC窗口tools菜单下应该多了一个pclint选项,可以用它来运行lint程序,对你的c/c++代码进行静态检查了。 现在就可以用个小程序测试一下pclint了 //test1.cpp #include class X { int *p; public: X() { p = new int[20]; } void init() { memset( p, 20, 'a' ); } ~X() { delete p; } }; 编译这个文件,看下你的编译器给你多少警告,再运行下lint, 可以自己对比一下。 我的机器上,VC产生0 errors 0 warnings, 而lint程序产生了如下8条警告信息,有些还是很有用处的提示,这里就不一一分析了. test.cpp(12): error 783: (Info -- Line does not end with new-line) test.cpp(7): error 1732: (Info -- new in constructor for class 'X' which has no assignment operator) test.cpp(7): error 1733: (Info -- new in constructor for class 'X' which has no copy constru

13,825

社区成员

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

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