用API的ShowWindow 函数即可,或者用CreateRect 直接创建一个RECT也行!

解决方案 »

  1.   

    Public Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Public Const SW_SHOWMINNOACTIVE = 7
    Public Const SW_SHOWNOACTIVATE = 4
    Dim Frm as form
    Set Frm =new Form1
    ShowWindow frm.hwnd,SW_SHOWMINNOACTIVE or SW_SHOWNOACTIVATE 
      

  2.   

    这个问题很简单,开始我也一直在思考,查了所有的API函数,都没能实现。后来想,窗口之所以能成活动窗口,是因为鼠标点击了它,于是我在鼠标点击前取得活动窗口的句柄,在点击后,再将原来的窗口设为活动窗口。非常简单,和输入法的软件盘一样。
    [email protected]
      

  3.   

    我说错了,抱歉!应当用CreateWindowEx这个函数!如果再不行则用CreteDC,一定能行!
    用DC一定没有焦点的。因为它仅仅是画出来。我准备去找一个VC的输入法原码,如可能转换后再给你。
    或者,你可以看一看关于tooltip中的回复。
      

  4.   

    输入法窗口,实际是两种窗口:
    输入法状态栏是Region, 是由Rgn相关函当选操作出来的。
    输入法的文字显示窗口则是windows 窗口类中的IME以下代码演示用VB创建IME窗口module:Option ExplicitPublic Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End TypeForm1:Option ExplicitPrivate Declare Function CreateWindowEx Lib "user32" _
        Alias "CreateWindowExA" (ByVal dwExStyle As Long, _
                                 ByVal lpClassName As String, _
                                 ByVal lpWindowName As String, _
                                 ByVal dwStyle As Long, _
                                 ByVal x As Long, _
                                 ByVal y As Long, _
                                 ByVal nWidth As Long, _
                                 ByVal nHeight As Long, _
                                 ByVal hWndParent As Long, _
                                 ByVal hMenu As Long, _
                                 ByVal hInstance As Long, _
                                 lpParam As Any) As Long
                                 Private Const WM_CREATE = &H1Private Const WS_EX_TOPMOST = &H8&Private Const WS_EX_LEFT = &H0Private Const WS_EX_LTRREADING = &H0
    Private Const WS_EX_RIGHTSCOLLBAR = &H0Private Const WS_BORDER = &H800000Private Const WS_POPUP = &H80000000
    Private Const WS_DISABLED = &H8000000
    Private Const WS_CLIPSIBLINGS = &H4000000
    Private Const WS_OVERLAPPED = &H0&
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate Const SW_NORMAL = 1
    Private Const SW_PARENTOPENING = 3
    Private Const SW_SHOW = 5Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As LongPrivate Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function FrameRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal HBRUSH As Long) As LongPrivate Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal HRGN As Long, ByVal HBRUSH As Long) As LongPrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
    Dim HwndNew As LongPrivate Sub Form_Load()
        
        Dim LREC As RECT
        
        Dim Hrect As Long
        
        Dim Hwdc As Long
        
        Dim WCOLOR As Long
        
        Dim HBRUSH As Long
        
        Dim HRGN As Long
            
        HwndNew = CreateWindowEx(WS_EX_TOPMOST, "IME", "New", WS_POPUP Or WS_DISABLED Or WS_CLIPSIBLINGS Or WS_OVERLAPPED, _
                    0, 0, 200, 200, Me.hwnd, 0, 0, WM_CREATE)
                    Debug.Print HwndNew
        
        ShowWindow HwndNew, SW_NORMAL
                     
        Hrect = GetClientRect(HwndNew, LREC)
        
        Hwdc = GetDC(HwndNew)
        
        WCOLOR = RGB(255, 255, 255)
        
        HRGN = CreateRectRgn(LREC.Left, LREC.Top, LREC.Right, LREC.Bottom)
        
        HBRUSH = CreateSolidBrush(WCOLOR)
        
        FillRgn Hwdc, HRGN, HBRUSH
        
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        DestroyWindow HwndNew
    End Sub