1。捕获鼠标的坐标,以及键盘的响应。把坐标放到一个变量中。
2。启动一个timer每秒检查一下变量中的坐标和现在鼠标的坐标是否一致,如果一致而且时间已到5分钟,那么就显示A窗体。此方法比较苯。不过可行。

解决方案 »

  1.   

    给个思路吧,这个我没试过
    重载A窗体的键盘事件OnKeyPress和鼠标OnMouseMove事件,设置一个全局变量,有任何鼠标键盘事件发生时复位,通过定时器判定这个变量的值,超过某一阀值的时候关闭A弹出的子窗体,
    这个思路也许会有问题,比如B的窗体在接收键盘事件后,该消息会不会到达A窗体,如果不能,还需要在B窗体进行重载,使得消息能到达A窗体。
      

  2.   

    谢谢2楼和3楼的朋友。
    我使用了
    [StructLayout(LayoutKind.Sequential)]
            public struct LASTINPUTINFO
            {
                [MarshalAs(UnmanagedType.U4)]
                public int cbSize;
                [MarshalAs(UnmanagedType.U4)]
                public uint dwTime;
            }
            [DllImport("user32.dll")]
            public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
            public static long GetLastInputTime()
            {
                LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO();
                vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo);
                if (!GetLastInputInfo(ref vLastInputInfo)) return 0;
                return Environment.TickCount - (long)vLastInputInfo.dwTime;
            }
    可以获取空闲时间。
    我的想法是能不能在A窗体启动的时候开启一个线程,然后这个线程就是监控空闲时间,并且如果时间达到了5分钟,那么我就返回A窗体。代码写的时候问题N多。呵呵。
      

  3.   

    A、B、C窗体只能有一个窗体是在最前端的。写个类,让A、B、C都继承。不用分别起线程吧。