我用VB开发的程序,有个提醒功能,就是每隔一段时间自动跳出一个窗口进行提醒,类似QQ收到新邮件后的提醒窗口,但碰到一个问题就是跳出窗口时这个应用程序会获得焦点,这对电脑的使用者很不方便,如何在跳出窗口时,这个应用程序不获得焦点

解决方案 »

  1.   

    弹出窗口前先获取目前活动窗口句柄在你的窗体active后再激活刚才纪录的窗体ok
      

  2.   

    简单的作法:
    弹出前先用getforegroundwindow得到窗口
    然后使用setforegroundwindow 刚才用getforegroundwindow得到的窗口   
      

  3.   

    当你show出另外一个窗体form2之后,再将form1获得焦点不就行了
      

  4.   

    假如弹出的窗口为:Form2'在代码文件头部加上如下代码:
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Const SWP_NOACTIVATE = &H10
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_SHOWWINDOW = &H40'在弹出窗口时使用如下代码来替换 Form2.Show:
    SetWindowPos Form2.hwnd, 0, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW
      

  5.   

    6楼的代码有个问题,我是用Timer做的提醒窗口弹出,第一次弹出时正常,应用程序未获得焦点,但第二次弹出时应用程序又获得了焦点,怎么回事?
      

  6.   

    不知你的代码是怎么写的,我刚刚也模拟了一下使用Timer,
    无论在vista 还是在 XP 下都没有问题,实在不行,你把
    SetWindowPos Form2.hwnd, 0, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW
    中的第二个参数 0 换成 1 即:HWND_BOTTOM试试,
    其实 setwindowpos的功能是非常强大的,具体用法可以到网上搜索。
      

  7.   

    我上次用API时不小心把一个窗口给搞得不能激活的那种(就是点了也没有焦点),现在忘了怎么会那样!
      

  8.   

    谢谢zhanghuacheng,也许我在弹出窗口的Form_Load事件中加了:q = SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, 3),是不是这一句对它有影响
      

  9.   

    谢谢,你发到我的QQ邮箱[email protected]
      

  10.   

    懒得发了,放上来,你自己去下载吧。
    http://download.csdn.net/source/1640888