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 Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Const GWL_STYLE = (-16)
Const WS_SYSMENU = &H80000Private Sub RemoveSysButton(ByVal hHwnd As Long)
'功能:移除窗口系统菜单
'参数:hHwnd - 窗口的句柄
Dim lWnd As Long
lWnd = GetWindowLong(hHwnd, GWL_STYLE)
lWnd = lWnd And Not (WS_SYSMENU)
lWnd = SetWindowLong(hHwnd, GWL_STYLE, lWnd)
DrawMenuBar hHwnd
End SubPrivate Sub Command1_Click()
Dim OneHwnd as long 
OneHwnd = Shell(某个应用程序, vbNormalFocus)
RemoveSysButton (OneHwnd)  '可以确知OneHwnd >0
End Sub
由于历史原因,某个程序源码丢失,如果从它的右上角的关闭按钮退出程序,则不能完全释放内存资源,所以老板现在要求:在启动它的时候移出它的右上角的关闭按钮!
以上代码对外部运行程序不起作用,郁闷!高手看一下,小妹那点出错了,谢谢先。

解决方案 »

  1.   

    Shell返回的进程的ID,并不是进程主窗口的ID
      

  2.   

    可以先用CreateToolhelp32Snapshot创建shell所返回进程中的线程,然后再用EnumThreadWindows来获得你要的窗口.
    也可以先用EnumWindows枚举所有父窗口,然后用GetWindowThreadProcessId来获得每个窗口的进程ID与Shell返回的进程ID比对
      

  3.   

    shell返回的不是窗体句柄
    你用GetWindowLong、SetWindowLong怎么可能成功叻~你不如用findwindow再找一下启动后窗体的句柄,如果窗体标题是动态的那就用楼上的楼上的方法罗
      

  4.   

    我很菜,都被api搞糊涂了,若外部应用程为“Notepad.exe”,运行记事本后,这样使用FindWindow(0,"Notepad.exe")还是用FindWindow(0,"未定标题 - 记事本")都不能找记事本程序窗体的句柄,楼上的再指点一下小妹,谢谢了。
      

  5.   

    绿豆:这样使用怎么也不行,我找不到CreateToolhelp32Snapshot函数的说明,看一,帮帮忙,谢谢了:
    '------------- API常数声明 ----------------------------
    Public Const TH32CS_SNAPPROCESS = &H2'---------- API类型声明   -----------
    Public Type PROCESSENTRY32                 '进程
        dwsize As Long
        cntusage As Long
        th32ProcessID As Long
        th32DefaultHeapID As Long
        th32ModuleID As Long
        cntThreads As Long
        th32ParentProcessID As Long
        pcPriClassBase As Long
        dwFlags As Long
        szExeFile As String * 1024
    End Type
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As LongPrivate Sub Command1_Click()
    Dim OneHwnd as long
    OneHwnd = Shell("notepad.exe", vbNormalFocus)
    Dim Process As PROCESSENTRY32
    Dim ProcSnap As LongProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If ProcSnap Then
      Process.dwsize = 1060                                        ' 通常用法
      Process32First ProcSnap, Process
      Do Until Process32Next(ProcSnap, Process) < 1                ' 遍历所有进程直到返回值为False
        If InStr(1, Process.szExeFile, "notepad.exe", vbTextCompare) > 0 Then
          RemoveSysButton Process.th32ProcessID'移出记事本的窗口系统菜单
          Exit Do
        End If
      Loop
      CloseHandle (ProcSnap)
    End IfEnd Sub
      

  6.   

    '窗体
    Private Sub Command1_Click()
        Dim pid As Long
        pid = Shell("notepad.exe", vbNormalFocus)
        
        EnumWindows AddressOf EnumWindowsProc, pid
    End Sub------------------------------------------------------------------------------------------------------------------
    '模块文件
    Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As LongPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
    Public Const GWL_STYLE = (-16)
    Public Const WS_SYSMENU = &H80000Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
        Dim pid As Long
        GetWindowThreadProcessId hwnd, pid
        
        If pid = lParam Then
            RemoveSysButton hwnd
        End If
        
        EnumWindowsProc = 1
    End FunctionPrivate Sub RemoveSysButton(ByVal hHwnd As Long)
    '功能:移除窗口系统菜单
    '参数:hHwnd - 窗口的句柄
    Dim lWnd As Long
    lWnd = GetWindowLong(hHwnd, GWL_STYLE)
    lWnd = lWnd And Not (WS_SYSMENU)
    lWnd = SetWindowLong(hHwnd, GWL_STYLE, lWnd)
    DrawMenuBar hHwnd
    End Sub