在一個UserControl上有這樣的設置:當鼠標移到某個Control(Ctl)上時使該Ctl獲得Focus.
1.   問題: 把該UserControl加到一個Form上面,怎樣使當這個Form不是當前活動窗口時,不發生上述事件.(因為這樣的話,這個Form就變成了活動窗口,而原先另外一個窗口就看不見了)
     我的思路是利用API返回當前Form的Name(或其它),然後再根據這個Name判斷要不要發生上述事件.請問是這樣的嗎?如果是的話,該用哪個API呢?
 2.        還是同一個UserControl,其所有者(一個Form)的Form_KeyPress事件是這樣的:當按回車鍵時,Focus跳到Form上的下一個Control.但是我想當Focus在UserControl上時觸發UserControl的KeyPress,而不發生Form_KeyPress事件,就是說不用將Focus轉到下個Control.如果有哪位高手能幫得上我的話,小弟不用感激,必將銘記在心!(當然分是少不了的啦~)
                                               在線等待中.............

解决方案 »

  1.   

    高手都去哪了?????????????????????
    問個簡單點的吧?怎樣判斷usercontrol的所有者(Form)是不是當前的活動窗口????解決即結貼!!!謝謝
      

  2.   

    用 WindowFromPoint 获取当前鼠标下的窗体句柄hWnd,然后用 GetWindowInfo 判断这个窗体当前是否是活动的。
    函数原型如下:
    ====================
    WindowFromPoint
    The WindowFromPoint function retrieves a handle to the window that contains the specified point. 
    HWND WindowFromPoint(
      POINT Point  // point
    );WindowFromPoint 返回鼠标所指窗口的句柄,
    Point参数是一个结构体,有X,Y两点,声明如下:
    Public Type PointAPI
        X As Long
        Y As Long
    End Type======================
    GetWindowInfo
    The GetWindowInfo function retrieves information about the specified window.BOOL GetWindowInfo(
      HWND hwnd,       // handle to window
      PWINDOWINFO pwi  // window information
    );If the function succeeds, the return value is nonzero.
    If the function fails, the return value is zero. 
    --------------------
    参数hwnd就用前面由 WindowFromPoint(Point) 返回的句柄
    pwi 是 一个WindowInfo 结构体,定义如下:typedef struct tagWINDOWINFO {
        DWORD cbSize;
        RECT  rcWindow;
        RECT  rcClient;
        DWORD dwStyle;
        DWORD dwExStyle;
        //--------------------
        DWORD dwWindowStatus;
        //--------------------
        UINT  cxWindowBorders;
        UINT  cyWindowBorders;
        ATOM  atomWindowType;
        WORD  wCreatorVersion;
    } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;上面的结构体中 dwWindowStatus 参数就是我们要用到的值
    dwWindowStatus 
    The window status. If this member is WS_ACTIVECAPTION, the window is active. Otherwise, this member is zero. 
    如果 dwWindowStatus 的值是 0 的话,那么这个窗口就不活动的,也就不是我们所要的 :)
    ======================
    我时间紧,就说这些了,剩下的我想楼主也该知道怎么做了。
      

  3.   

    用 Screen.ActiveForm is yourForm 判断。
    求求你,给点分吧!
      

  4.   

    typedef struct tagWINDOWINFO {
        DWORD cbSize;
        RECT  rcWindow;
        RECT  rcClient;
        DWORD dwStyle;
        DWORD dwExStyle;
        //--------------------
        DWORD dwWindowStatus;
        //--------------------
        UINT  cxWindowBorders;
        UINT  cyWindowBorders;
        ATOM  atomWindowType;
        WORD  wCreatorVersion;
    } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;不好意思,這段東東我是什麼呀,怎麼用的???
      

  5.   

    To: yangfanatcsdn(好好学习天天向上)
     
      謝謝你啦,這麼簡單的方法我怎麼就沒想到呢??(呵呵,你放心,少不了你的分)
     第一個問題已經解決了,不過你先別急,我的第二個問題還沒解決啊.再等一會吧,看有沒有哪位好 心的大蝦能幫幫我,搞定它!!!!!!!!To: fleshboy(百菜) 
      謝謝!!能再幫我看看第二題嗎?
      

  6.   

    不明白Q2的意思
    焦点不会自动在控件间转换,要么按Tab键,要么编程实现,要么设置快速访问键,要么使用鼠标。
    而且只要你不设置Form.KeyPreview = True,窗体不会截获控件的击键事件。
      

  7.   

    yangfanatcsdn(好好学习天天向上) 
    用 Screen.ActiveForm is yourForm 判断。
    求求你,给点分吧!錯啦錯啦,Screen.ActiveForm 只能判斷同這個程序裡的Form,
    但如果我在運行這個程序時,又打開另外一個程序或別的什麼東西,只要鼠標移到usercontrol的
    control上,它還是會得到焦點的.(而另外的那個程序就隱藏到它的下面了)
      

  8.   

    可能是我沒說明白吧:)
    我把代碼貼出來:
    這是Form上的代碼:
    Private Sub Form_KeyPress(KeyAscii As Integer)
         Select Case KeyAscii
            Case vbKeyEscape
                SendKeys "%{C}"
            Case vbKeyReturn
                SendKeys "{TAB}"
                KeyAscii = 0
        End Select
    End Sub這是UserControl上的代碼:
    Private Sub cboColor_KeyPress(KeyAscii As Integer)    
        Dim l_intPos As Integer
        Dim l_strTmp As String
        '轉換成大寫    
        If KeyAscii >= Asc("a") And KeyAscii <= Asc("z") Then KeyAscii = KeyAscii + Asc("A") - Asc("a")
        l_strTmp = Trim(cboColor.Text)
        '按回車鍵則添加記錄(空記錄或重復記錄除外)
        If KeyAscii = vbKeyReturn And l_strTmp <> "" Then
            For l_intPos = 0 To cboColor.ListCount - 1
                If StrComp(l_strTmp,cboColor.List(l_intPos),vbTextCompare) = 0 Then
                    cboColor.Text = ""
                    Exit Sub
                End If
            Next
            cboColor.AddItem l_strTmp, 0
            cboColor.Text = ""
        End If    
    End Sub現在的問題的是:在usercontrol上的cbocolor上按回車鍵時,運行的是Form_KeyPress而非
    cboColor_KeyPress事件.請問這樣的沖突該怎樣解決呀???能不能使得在cbocolor上按回車鍵時就AddItem,而在其它地方按回車鍵時就Sendkeys "{tab}"呢????????
      

  9.   

    你是否为将这个控件的keyress事件和cboColor的keyress事件绑定到一起
      

  10.   

    To: goldstar3000(金星) 
    請問如何綁定?