VB里面这样搞,老是非法操作,而用VC的SDK方式则能通过,哪位老大帮我找找原因的所在,非常感谢哦!
'VB实现代码
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongDim lngHWND As Long
Dim lngHDC  As LongSub Main()
    MsgBox "准备开始了!", vbInformation, "提示"
    Call EnumWindows(AddressOf EnumWindowsPro, 0&)
End SubFunction EnumWindowsPro(hwnd As Long, lParam As Long) As Boolean
    Debug.Print lParam
    lngHWND = hwnd
    lngHDC = GetDC(hwnd)
    
    Call Ellipse(hdc, 0, 0, 100, 60)
    
    Call ReleaseDC(hwnd, lngHDC)
    
    EnumWindowsPro = True
End Function
//VC_SDK实现代码
#include <windows.h>BOOL CALLBACK EnumWindowsProc(HWND, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
   LPSTR     lpCmdLine, int   nShowCmd)
{
EnumDesktopWindows(NULL, EnumWindowsProc, NULL);
return 0;
}BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
HDC hdc; hdc = GetDC(hwnd); Ellipse(hdc, 0, 0, 100, 40); ReleaseDC(hwnd, hdc);
return TRUE;
}

解决方案 »

  1.   

    Call Ellipse(hdc, 0, 0, 100, 60)中的hdc没定义!!!
      

  2.   

    agree你根本没有限制option explicitCall Ellipse(lngdc, 0, 0, 100, 60)
      

  3.   

    上面的改过来了,还是不对了。在EnumWindowsPro(hwnd As Long, lParam As Long)中遍历的时候,有时候一读hwnd或lParam便出现不能读的非法操作,谁知道呢?
      

  4.   

    Function EnumWindowsPro(hwnd As Long, lParam As Long) As Boolean
    on error resume next  '''加上这个试试
    ...
      

  5.   

    还有,在用回调函数的时候,尽量避免使用 msgbox ,避免单步调试,直接运行看效果
      

  6.   

    开始的时候以为你的程序是混合编成呢,后来一看就是VB的,你忘记了VB是默认传址的,这样写,
    Option Explicit
    Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Public Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongSub Main()
        MsgBox "准备开始了!", vbInformation, "提示"
        Call EnumWindows(AddressOf EnumWindowsPro, 0&)
    End SubFunction EnumWindowsPro(ByVal hwnd As Long, ByVal lParam As Long) As Long
        Dim lngHDC As Long
        lngHDC = GetDC(hwnd)
        If lngHDC Then
            Call Ellipse(lngHDC, 0, 0, 100, 60)
            Call ReleaseDC(hwnd, lngHDC)
        End If
        EnumWindowsPro = 1
    End Function
    现在我运行这个程序能够把我的一些窗体上画上椭圆。
      

  7.   

    Function EnumWindowsPro(ByVal hwnd As Long, ByVal lParam As Long) As BooleanByVal!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!