有一程序A(只有一个Form)运行在桌面最上层,
现在最小化(或其他动作,只要保证程序A仍处于最上层即可)其他程序,如资源管理器等,
希望知道这个动作会触发程序A的什么事件。

解决方案 »

  1.   

    TopMost=true???
    其他程序最小化,和A程序有什么关系?
      

  2.   

    没办法检测。
    刚才我用spy++试了,如果这个最小化的窗口在这个窗口的下方(即至少有一部分被覆盖),那么产生了如下windows消息:/*<00001> 002301FA S WM_WINDOWPOSCHANGING lpwp:0498EAB4
    <00002> 002301FA R WM_WINDOWPOSCHANGING
    <00003> 002301FA S WM_WINDOWPOSCHANGED lpwp:0498EAB4
    <00004> 002301FA R WM_WINDOWPOSCHANGED
    <00005> 002301FA S WM_ACTIVATEAPP fActive:True dwThreadID:0000168C
    <00006> 002301FA R WM_ACTIVATEAPP
    <00007> 002301FA S WM_NCACTIVATE fActive:True
    <00008> 002301FA R WM_NCACTIVATE
    <00009> 002301FA S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
    <00010> 000A0BEA S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
    <00011> 000A0BEA S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
    <00012> 000A0BEA R WM_IME_NOTIFY
    <00013> 000A0BEA R WM_IME_SETCONTEXT
    <00014> 000A0BEA S WM_SETFOCUS hwndLoseFocus:(null)
    <00015> 002301FA S WM_CTLCOLORBTN hdcButton:7001111F hwndButton:000A0BEA
    <00016> 002301FA R WM_CTLCOLORBTN hBrush:01900015
    <00017> 000A0BEA S WM_GETTEXTLENGTH
    <00018> 000A0BEA R WM_GETTEXTLENGTH cch:9
    <00019> 000A0BEA S WM_GETTEXT cchTextMax:20 lpszText:0498D510
    <00020> 000A0BEA R WM_GETTEXT cchCopied:9 lpszText:0498D510 ("c")
    <00021> 002301FA S WM_DRAWITEM idCtl:658410 lpdis:0498DCF4
    <00022> 000A0BEA S message:0x202B [User-defined:WM_USER+7211] wParam:000A0BEA lParam:0498DCF4
    <00023> 000A0BEA R message:0x202B [User-defined:WM_USER+7211] lResult:00000000
    <00024> 002301FA R WM_DRAWITEM fProcessed:False
    <00025> 000A0BEA R WM_SETFOCUS
    <00026> 002301FA R WM_ACTIVATE
    <00027> 000A0BEA P WM_PAINT hdc:00000000
    <00028> 002301FA S WM_NCACTIVATE fActive:False
    <00029> 002301FA R WM_NCACTIVATE fDeactivateOK:True
    <00030> 002301FA S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(null)
    <00031> 002301FA R WM_ACTIVATE
    <00032> 002301FA S WM_ACTIVATEAPP fActive:False dwThreadID:00000C28
    <00033> 002301FA R WM_ACTIVATEAPP
    <00034> 000A0BEA S WM_KILLFOCUS hwndGetFocus:(null)
    <00035> 000A0BEA R WM_KILLFOCUS
    <00036> 000A0BEA S WM_IME_SETCONTEXT fSet:0 iShow:C000000F
    <00037> 000A0BEA S WM_IME_NOTIFY dwCommand:IMN_CLOSESTATUSWINDOW dwCommand:00000001 dwData:00000000
    <00038> 000A0BEA R WM_IME_NOTIFY
    <00039> 000A0BEA R WM_IME_SETCONTEXT
    <00040> 000A0BEA P WM_PAINT hdc:00000000
    */
    本来我以为其中的消息产生序列和WinUser+7211可以做一点文章,但后来我试着用另外一个完全不被覆盖的窗口执行最,SPY++没有任何输出。
      

  3.   

    [DllImport("user32.dll", EntryPoint="IsIconic")]
    public static extern int IsIconic (
    int hwnd
    );使用IsIconic判断窗口是否最小化了
      

  4.   

    using System;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace WindowsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        [DllImport("user32.dll", EntryPoint = "FindWindow")]
            public static extern int FindWindow(
                string lpClassName,
                string lpWindowName
            );        [DllImport("user32.dll", EntryPoint = "IsIconic")]
            public static extern int IsIconic(
                int hwnd
            );        private void timer1_Tick(object sender, EventArgs e)
            {
                timer1.Enabled = false;
                int h = FindWindow("SciCalc", "计算器");
                if (h != 0)
                {
                    this.TopMost =IsIconic(h)==1?true:false;
                }
                timer1.Enabled = true;
            }        private void Form1_Load(object sender, EventArgs e)
            {
                System.Diagnostics.Process.Start("calc.exe");
                timer1.Interval = 1000;
                timer1.Enabled = true;
                timer1.Tick += new EventHandler(timer1_Tick);
            }
        }
    }
      

  5.   

    对了,我没做过HOOK,但应该可以HOOK窗口的最小化事件的。这应该可以做得到。ZengHD的方法是使用程序的方法循环检测最小化的窗口,但是你必须要知道系统中有多少应用程序才行。如果你启动了其它的窗口,而没有在你的检测队列中,你将无法查询到这个消息。另外你也需要维持一个队列,以知道这个窗口的状态。否则,最小化的窗口将持续的收到最小化的状态消息,因为IsIocnic将始终返回TRUE。
      

  6.   

    7楼的方法好像不行。只是为了达到我2楼所说的效果,没办法,只有换一种思路,简单点用一个Timer来不停的刷基本达到了我的目的。
      

  7.   

    我的代码就是使用Timer,怎么会没有效果呢?
      

  8.   

    To 12楼就如phy在11所说,当前系统中可能有很多应用程序。我用Timer是不停的Paint画面。