如上。

解决方案 »

  1.   

    枚举桌面窗口,用Class name查找Shell_TrayWnd。
    这其中又包含3个字窗口,分别是开始按钮、任务栏、系统托盘
      

  2.   

    任务栏的className是 Shell_TrayWnd,然后Findwindow就拿到了任务栏的句柄,
    接下来就不用说了吧
      

  3.   

    要这个主要是因为我用了一个CFrameWnd类,去掉了标题栏
    在最大化的时候会遮住桌面的任务栏
    这样获取任务栏后手动设置窗口的最大化,可行吗?
      

  4.   

    用SystemParametersInfo可以得到work area的大小
    再获得屏幕大小取差
    是你想要的吗?
      

  5.   

    work area是指的去任务栏的那块区域吗?
    假如我的窗口在最大化的状态时,拉大了任务栏,那窗口也就随之变化,请问这样的消息应该写在哪啊?
      

  6.   

    RECT rect;
    HWND hWnd = ::FindWindow("Shell_TrayWnd", 0);
    ::GetWindowRect(hWnd,&rect);
      

  7.   

    谢谢 vcmute(横秋)
    我在这个函数中设置窗口的最大最小化。当任务栏拉大时最大化的窗口可以相应改变,不会遮住任务栏。可是当任务栏再拉小时,窗口不能做出相应的改变。请问还就在哪里写消息响应??void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED); lpMMI->ptMinTrackSize.x = 800;
    RECT rect;
    HWND hWnd = ::FindWindow("Shell_TrayWnd", 0);
    ::GetWindowRect(hWnd,&rect);
    lpMMI->ptMinTrackSize.y = 600;
    lpMMI->ptMaxTrackSize.x = 1024;
    lpMMI->ptMaxTrackSize.y = 768-(rect.bottom-rect.top); CFrameWnd::OnGetMinMaxInfo(lpMMI);
    }
      

  8.   

    你的意思是改变系统任务栏大小之后,把窗口最大化的大小也改变?
    用SystemParametersInfo带SPI_SETWORKAREA参数,pvParam传入改变大小后的RECT指针。这样就行了RECT rc;
    SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, 0);
      

  9.   

    To:pomelowu(羽战士) 是那样的意思。只是没太懂,应该要在哪里写?
    在 OnGetMinMaxInfo中?
    我在 OnGetMinMaxInfo中那样写的(如上)只是设置了最大的尺寸,窗口还可以被拖动大小,怎样设置它为最大化状态?
      

  10.   

    RECT rc;
    rc.left=0;
    rc.top=0;
    rc.right=GetSystemMetrics(SM_CXSCREEN);
    RECT rect;
    HWND hWnd = ::FindWindow("Shell_TrayWnd", 0);
    ::GetWindowRect(hWnd,&rect);
    rc.bottom=GetSystemMetrics(SM_CYSCREEN)-(rect.bottom-rect.top); ShowWindow(SW_SHOWMAXIMIZED );   //注意这里,先最大化
    MoveWindow(&rc);  //再改变大小这是基于对话框的 无标题栏的窗口;完全不需要自己去写改变系统任务栏的响应函数
    测试:
    void CMy1Dlg::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);

    CString m_show;
    m_show.Format("cx:%d;cy:%d",cx, cy);
    MessageBox(m_show);
    }
      

  11.   

    麻烦你能告诉我这个应该写在哪个函数中?
    在OnGetMinMaxInfo中写不行。
    我的这个是FrameWnd类
      

  12.   

    哎,今天没事情,多写点给你CMainFrame::OnCreate中可以
      

  13.   

    呵呵,多谢  LCBoy() 。
    这样写在初始化的时候是最大化状态,但是拉动任务栏后就不行了。
    还应在哪有相应的处理啊?
    有空再提点下我吧。@@
      

  14.   

    郁闷,给个简化的代码
    [email protected]
    真这么怪@
      

  15.   

    在窗口的回调函数中捕获修改WM_GETMINMAXINFO消息:
    ((LPMINMAXINFO)lParam)->ptMaxSize.x = GetSystemMetrics(SM_CXMAXIMIZED);    //最大化宽
    ((LPMINMAXINFO)lParam)->ptMaxSize.y = GetSystemMetrics(SM_CYMAXIMIZED);    //最大化高
    ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK);//可调整最小宽
    ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = iCH + iMH;           //可调整最小高
    ((LPMINMAXINFO)lParam)->ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK);//可调整最大宽
    ((LPMINMAXINFO)lParam)->ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK);//可调整最大高
    break;
      

  16.   

    to :rainivy(Rain)  
    不好意思啊,窗口的回调函数是哪个??
    我现在的程序任务栏拉大时最大化的窗口可以相应改变,不会遮住任务栏。
    你所以的这样做的话,能使:
    可是当任务栏再拉小时,窗口能做出相应的改变(即变大??)。谢谢回复
      

  17.   

    to :pomelowu(羽战士) 你的意思是改变系统任务栏大小之后,把窗口最大化的大小也改变?
    用SystemParametersInfo带SPI_SETWORKAREA参数,pvParam传入改变大小后的RECT指针。这样就行了RECT rc;
    SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, 0);你的这个方法好像是很可行的,麻烦你说详细一点点啊。
    谢谢啊。等待~~
      

  18.   

    RECT rc;
    SystemParametersInfo(SPI_SETWORKAREA, 0, (PVOID)&rc, SPIF_SENDCHANGE);把最后一个参数改为SPIF_SENDCHANGE,则在SystemParametersInfo调用后会广播一条WM_SETTINGCHANGE消息。那么在程序中截获WM_SETTINGCHANGE即可。