你SendMessage发的是什么消息?拖动鼠标的时候可不可以先判断窗口大小再发消息?

解决方案 »

  1.   

    if (e.LeftButton == MouseButtonState.Pressed)
    {
        Win32.SendMessage(_HwndSource.Handle, 0x112, (IntPtr)(61444), IntPtr.Zero);
    }
    _HwndSource.Handle是窗口的句柄判断了窗口大小也没用。比如
    if(this.ActualWidth > this.MinWidth)
        //执行SendMessage()
    条件只是限制在窗口宽小于最小宽的时候,不执行
    如果宽大于最小宽,就可以执行,只要一旦执行了SendMessage,就可以随意拖动了,而无视了最小宽和高
      

  2.   

    我只能看出来你发的WM_SYSCOMMAND的消息,61444貌似是以右下角为基点改变Form.Width,Form.Height 你的这个事件选的不太合适,你要求的是拖动鼠标改变窗口的大小,那么就应该在MouseMove事件里面的处理在那里应该可以判断
      

  3.   

    加个SizeChanged  事件 可以吧
      

  4.   

    我的确是在MouseMove事件中改变窗口大小的,61444是改变左上角,我总共有8个方向的改变。问题就是只要使用了SendMessage这个API,一旦可以拖动开始改变大小的时候,就停不下来,可以一直拖到窗口只有一点点的大小,因为MouseMove事件也是需要等待SendMessage函数返回了,才结束,才会执行下一次的MouseMove,而在SendMessage函数返回前,窗口是可以任意改变大小,这让我很苦恼
      

  5.   

    SizeChanged事件是在窗口改变大小的操作完成以后才触发的
      

  6.   


    有句柄的话有没有试试MoveWindow,要不试试PostMessage?
      

  7.   

    恩,我最想要的是有一个监听,在实时的窗口改变大小的过程中,判断窗口的宽高,不过现在只能试试其他的API了,3Q cnfixit
      

  8.   

    WPF下的窗口设置 ResizeMode="CanResizeWithGrip" 然后就可以直接设置窗口的 Width 和 Height 来改变窗口大小了,而且 MinWidth 和 MinHeight 是起作用的。
             private void window_Resize(object sender, System.Windows.Input.MouseEventArgs e)
            {
                    if (resizeType == ResizeType.Width)
                    {
                        double width = e.GetPosition(win).X + 5;
                        if (width > 0)
                        {
                            win.Width = width;
                        }
                    }
                    if (resizeType == ResizeType.Height)
                    {
                        double height = e.GetPosition(win).Y + 5;
                        if (height > 0)
                        {
                            win.Height = height;
                        }
                    }         
            }
      

  9.   

            
    private void TitleBar_MouseLeftDown(object sender,MouseButtonEventArgs e)
            {
                Window win = (Window)((FrameworkElement)sender).TemplatedParent;            if (e.ClickCount == 2)
                {
                    //win.Close(); 
                    //在这里调用最大化窗体或者还原!
                    return;
                }
                win.DragMove();
            }
      

  10.   

    //因为wpf事件路由为冒泡或者隧道,所以处理鼠标左键按下事件就可以了,判断ClickCount==2就知道是双击    
        private void TitleBar_MouseLeftDown(object sender,MouseButtonEventArgs e)
            {
                Window win = (Window)((FrameworkElement)sender).TemplatedParent;            if (e.ClickCount == 2)
                {
                    //win.Close(); 
                    //在这里调用最大化窗体或者还原!
                    return;
                }
                win.DragMove();
            }