我得到一个Excel,我想用API将其子窗体的ControlBox去掉,用以下代码没有将其除去,请问有什么办法可以解决?dim mlngXLhwnd as longmlngXLhwnd=FindWindow("XLMAIN","主窗体名称")dim mlngChild as long
mlngChild=GetWindow(mlngXLhwnd,GW_CHILD)  '获得其子窗体的句柄dim lngStyle as long
lngStyle=GetWindowLong(mlngChild,GWL_STYLE)
lngStyle = lngStyle Xor WS_CAPTION
lngStyle = lngStyle Xor WS_SIZEBOX
SetWindowLong mlngChild, GWL_STYLE, lngStyle

解决方案 »

  1.   

    Declare Function GetActiveWindow Lib "user32.dll"() As Long
    Declare Function SetMenu Lib "user32.dll"(Byval HMenu As Long,Byval NewMenu As Long ) As Integer
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPrivate Const MF_REMOVE = &H1000&
    public const sc_close=&HF060
    Private Const SC_MAXIMIZE = &HF030&
    Private Const SC_MINIMIZE = &HF020&Private Sub MDIForm_Load()
        Dim hMenu As Long
    dim mlngXLhwnd as longmlngXLhwnd=FindWindow("XLMAIN","主窗体名称")    hMenu = GetSystemMenu(mlngXLhwnd, 0)
        RemoveMenu hMenu, SC_MINIMIZE, MF_REMOVE  '最小化不可用
        RemoveMenu hMenu, SC_MAXIMIZE, MF_REMOVE   ‘最大化不可用
       removemenu hmenu,sc_close,MF_REMOVE     '关闭不可用End Sub
      

  2.   

    TO 楼上主窗体的我已经去掉了,现在是想去除其子窗体的三个按钮,使一个MDI看起来像一个单文档界面一样,请问该如何实现,谢谢!
      

  3.   

    把 :
    Dim hMenu As Long
    dim mlngXLhwnd as longmlngXLhwnd=FindWindow("XLMAIN","主窗体名称")    hMenu = GetSystemMenu(mlngXLhwnd, 0)
        RemoveMenu hMenu, SC_MINIMIZE, MF_REMOVE  '最小化不可用
        RemoveMenu hMenu, SC_MAXIMIZE, MF_REMOVE   ‘最大化不可用
       removemenu hmenu,sc_close,MF_REMOVE  
    加到调出字窗体的代码中试试看呢?
      

  4.   

    我并不是想隐藏自己写的Form的三个按钮,而是想隐藏EXCEL的子窗体的三个按钮。我用SetWindowPos写了一句代码
    SetWindowPos 子窗体句柄,0,0,0,0,0,SWP_NOSIZE在当前的Sheet页面没有焦点的情况下,好像是不见了,一旦Sheet获得焦点,完蛋了,又出来了。
    分数加到100分,求各位能手了。谢谢大家,谢谢楼上。
      

  5.   

    不知道这个段代码,你是否有用呢?
    '设置窗体结构信息函数
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    '获取窗体结构信息函数
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Const GWL_STYLE = (-16)
    Private Const WS_SYSMENU = &H80000
    Private Const WS_CAPTION = &HC00000
    Private Const WS_SIZEBOX = &H40000
    Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    '为窗体指定一个新位置和状态函数
    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_NOZORDER = &H4
    Private Const SWP_FRAMECHANGED = &H20
    Private Const SWP_NOREPOSITION = &H200
    '获得整个窗体的大小和位置
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type
    Dim Change As Boolean
    Private Sub mdiForm_Click()
    Dim lStyle As Long
    Dim MyRect As RECT
    '获取窗体的大小和位置
    GetWindowRect Me.hwnd, MyRect
    '取得当前窗体信息
    lStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
    If Change Then
    '分别使系统菜单(包括图标)、标题、大小、最大化、最小化显示/有效
    lStyle = lStyle Or WS_SYSMENU
    lStyle = lStyle Or WS_CAPTION
    lStyle = lStyle Or WS_SIZEBOX
    lStyle = lStyle Or WS_MAXIMIZEBOX
    lStyle = lStyle Or WS_MINIMIZEBOX
    Else
    '分别使系统菜单(包括图标)、标题、大小、最大化、最小化隐藏/无效
    lStyle = lStyle And Not WS_SYSMENU
    lStyle = lStyle And Not WS_CAPTION
    lStyle = lStyle And Not WS_SIZEBOX
    lStyle = lStyle And Not WS_MAXIMIZEBOX
    lStyle = lStyle And Not WS_MINIMIZEBOX
    End If
    '按lStyle的值设置窗体信息
    SetWindowLong Me.hwnd, GWL_STYLE, lStyle
    '保持窗体的大小与位置不变
    SetWindowPos Me.hwnd, 0, MyRect.Left, MyRect.Top, MyRect.Right - MyRect.Left, MyRect.Bottom - MyRect.Top, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
    '改变显示/隐藏状态
    Change = Not Change
    End Sub
      

  6.   

    是因为mlngChild的结果不对,试试enumchildwindos
    实在不行,取子窗口类名,好象Excel的子窗口类名都是EXCEL7
      

  7.   

    没用啊,代码拷下来了,大家帮我看看是哪儿出问题了。我的代码如下,大家有兴趣建一个Form,将以下代码拷到Form_Load事件中即可
        Dim lngStyle As Long
        Dim mlngXLHwnd as long
        
        Dim mobjXL As New Excel.Application
        
        mobjXL.Caption = "主窗体"
        '找到窗口,并将其设为子窗体
        mobjXL.Visible = True
        mlngXLHwnd = FindWindow("XLMAIN", "主窗体")
        SetParent mlngXLHwnd, Me.hwnd
        
        '去除其ControlBox等属性
        lngStyle = GetWindowLong(mlngXLHwnd, GWL_STYLE)
        lngStyle = lngStyle Xor WS_CAPTION
        lngStyle = lngStyle Xor WS_SIZEBOX
        
        SetWindowLong mlngXLHwnd, GWL_STYLE, lngStyle
      
        mobjXL.Application.RecentFiles.Maximum = 0
        
        Dim mobjWorkBook As Workbook
        If strFileName = "" Then
            '新建一个文件
            Set mobjWorkBook = mobjXL.Workbooks.Add
        Else
            '打开当前文件
            Set mobjWorkBook = mobjXL.Workbooks.Open(strFileName)
        End If
        
        Set mobjSH = mobjWorkBook.ActiveSheet
        
        '将窗口移至指定位置
        Dim mRect As RECT
        GetClientRect Me.hwnd, mRect
        
        MoveWindow mlngXLHwnd, mRect.Left, mRect.Top, mRect.Right - mRect.Left, mRect.Bottom - mRect.Top, 1
        
        '设置当前窗口的状态,设其最大化
        Me.WindowState = 2
            
        Dim lngChildhwnd As Long    mobjXL.ActiveWindow.WindowState = xlMaximized
        
        lngChildhwnd = GetWindow(mlngXLHwnd, GW_CHILD)
        
        lngStyle = GetWindowLong(lngChildhwnd, GWL_STYLE)
        lngStyle = lngStyle And Not WS_MAXIMIZEBOX
        lngStyle = lngStyle And Not WS_MINIMIZEBOX
        lngStyle = lngStyle And Not WS_SIZEBOX
        SetWindowPos lngChildhwnd, 0, 0, 0, 0, 0, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
      
        mobjWorkBook.Activate
        
        Me.Show
      

  8.   

    可是实现了!代码部分修改如下:
     mobjXL.ActiveWindow.WindowState = xlMaximized
        
        lngChildhwnd = GetWindowLong(mlngXLHwnd, GW_CHILD)
        
        lngStyle = GetWindowLong(lngChildhwnd, GWL_STYLE)    lngStyle = lngStyle And Not WS_SYSMENU  '新添加
    lngStyle = lngStyle And Not WS_CAPTION      '新添加
        lngStyle = lngStyle And Not WS_MAXIMIZEBOX
        lngStyle = lngStyle And Not WS_MINIMIZEBOX
        lngStyle = lngStyle And Not WS_SIZEBOX
        SetWindowLong lngChildhwnd, GWL_STYLE, lngStyle  '新添加
     'SetWindowPos lngChildhwnd, 0, 0, 0, 0, 0, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED   '不要
      
        mobjWorkBook.Activate
        
        Me.Show
      

  9.   

    我又得到一个方法
    就是通过GetSystemMenu获得系统菜单然后再RemoveMenu去除“关闭”项
    用代码在主窗体上通过
    代码如下:
        Dim hMenu As Long
        hMenu = GetSystemMenu(Me.hwnd, 0)
        RemoveMenu hMenu, &HF060, MF_BYCOMMAND但就是无法设置Excel的子窗体。就其本身来讲,这个Excel的子窗体应当算是Form的孙窗体(因为EXCEL为FORM的子窗体)当通过楼上上的代码设置hMenu=GetSystemMenu(lngChildhwnd,0)时,得到的hMenu为0,即没有SystemMenu!!!!!!!!!!!!!!!!!!!!!!!!!!!!!晕了,不知道了
      

  10.   

    To yassee(甲克虫)用了那个新增加的几个语句,好像还是不行啊
      

  11.   

    试了yassee(甲克虫)的代码,偶尔可以。并且退出后EXCEL出错。
      

  12.   

    退出Excel报错倒也正常,那是没有加上以下代码mobjXL.Visible = False
    mobjXL.Quit
    Set mobjXL = Nothing我可是没有一次成功了的,不知道楼上用的代码是怎么样的。
      

  13.   

    lngChildhwnd = GetWindow(mlngXLHwnd, GW_CHILD)'取的lngChildhwnd不是子窗体的hWnd,为什么? 可以用Spy++找到它(lngChildhwnd)的hWnd然后setwindowlong...
      

  14.   

    怎么会?我实现的蛮好啊?部分定义以及代码:
        Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    '获取窗体结构信息函数
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Const GWL_STYLE = (-16)
    Private Const WS_SYSMENU = &H80000
    Private Const WS_CAPTION = &HC00000
    Private Const WS_SIZEBOX = &H40000
    Private Const WS_MAXIMIZEBOX = &H10000
    Private Const WS_MINIMIZEBOX = &H20000
    '为窗体指定一个新位置和状态函数
    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_NOZORDER = &H4
    Private Const SWP_FRAMECHANGED = &H20
    Private Const SWP_NOREPOSITION = &H200
    '获得整个窗体的大小和位置
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
    End Type
    Private Sub Form_Load()
    Dim lngStyle As Long
        Dim mlngXLHwnd As Long
        
        Dim mobjXL As New Excel.Application
        
        mobjXL.Caption = "主窗体"
        '找到窗口,并将其设为子窗体
        mobjXL.Visible = True
        mlngXLHwnd = FindWindow("XLMAIN", "主窗体")
       ' SetParent mlngXLHwnd, Me.hwnd
        
        '去除其ControlBox等属性
        lngStyle = GetWindowLong(mlngXLHwnd, GWL_STYLE)
        lngStyle = lngStyle Xor WS_CAPTION
        lngStyle = lngStyle Xor WS_SIZEBOX
        
        SetWindowLong mlngXLHwnd, GWL_STYLE, lngStyle
      
        mobjXL.Application.RecentFiles.Maximum = 0
        
        Dim mobjWorkBook As Workbook
        If strFileName = "" Then
            '新建一个文件
            Set mobjWorkBook = mobjXL.Workbooks.Add
        Else
            '打开当前文件
            Set mobjWorkBook = mobjXL.Workbooks.open(strFileName)
        End If
        
        Set mobjSH = mobjWorkBook.ActiveSheet
        
        '将窗口移至指定位置
        Dim mRect As RECT
        'GetClientRect Me.hwnd, mRect
        
       ' MoveWindow mlngXLHwnd, mRect.Left, mRect.Top, mRect.Right - mRect.Left, mRect.Bottom - mRect.Top, 1
        
        '设置当前窗口的状态,设其最大化
        Me.WindowState = 2
            
        Dim lngChildhwnd As Long    mobjXL.ActiveWindow.WindowState = xlMaximized
        
        lngChildhwnd = GetWindowLong(mlngXLHwnd, GW_CHILD)
        
        lngStyle = GetWindowLong(lngChildhwnd, GWL_STYLE)
        lngStyle = lngStyle And Not WS_SYSMENU
    lngStyle = lngStyle And Not WS_CAPTION
        lngStyle = lngStyle And Not WS_MAXIMIZEBOX
        lngStyle = lngStyle And Not WS_MINIMIZEBOX
        lngStyle = lngStyle And Not WS_SIZEBOX
        SetWindowLong lngChildhwnd, GWL_STYLE, lngStyle
    'SetWindowPos lngChildhwnd, 0, MyRect.Left, MyRect.Top, MyRect.Right - MyRect.Left, MyRect.Bottom - MyRect.Top, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED    'SetWindowPos lngChildhwnd, 0, 0, 0, 0, 0, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED 'bu hao
      
        mobjWorkBook.Activate
        
        Me.Show
    End Sub
      

  15.   

    还是不行你再加一个事件试试看如何Private Sub Form_Resize()    Dim mRect As RECT
        modDefine.GetClientRect Me.hwnd, mRect
        MoveWindow mlngXLHwnd, mRect.Left, mRect.Top, mRect.Right - mRect.Left, mRect.Bottom - mRect.Top, 1End Sub
      

  16.   

    me.controlbox=false  '"属性"中设置
      

  17.   

    TO fuanwei(草原上狂奔的蜗牛) taomaintao(跟你拼了(.net)) 
      不是VB的子窗体,可能是我的标题写得有问题。这个子窗体是指Excel的子窗体
      

  18.   

    奇怪,csdn可以贴图,我就把我运行的图片帖出来给你看了!怎么还不行呢?
      

  19.   

    me.controlbox=false  '"属性"中设置 应该可以的我用过