2016-04-27 68 views
-1

如何檢測焦點窗口是否爲編輯「類型」控件?我知道的一種方法是使用Microsoft Active Accessibility,看起來它會涉及使用這種方法的很多努力。如何檢測焦點窗口是否爲編輯「類型」控件?

有沒有另一種方法,我可以使用更簡單?

我的用例是:當編輯控件有焦點時,存儲hwnd

// Callback set by SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, (WINEVENTPROC)&winEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS); 
void CALLBACK KeyboardComponent::winEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, 
    LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) 
{ 
    // if hwnd == "Edit Control" store hwnd to send key input events 

    // One technique but not comprehensive 
    TCHAR wndClassName[255]; 
    GetClassName(hwnd, wndClassName, 255); 

    if (_tcsicmp(wndClassName, _T("edit")) == 0) 
     targetEdit = hwnd; 

    // Class names I am receiving are subclassed or new window classes that look and operate like Edit controls. 
    // Ie when clicking the Firefox address bar I get: MozillaWindowClass 
    // Ie when clicking the Chrome address bar I get: Chrome_WidgetWin_1 
} 
+2

有什麼不好的代碼?使用Windows API可以查看窗口類的名稱,這正是您正在做的。 –

+1

我必須投票這個問題,因爲,如果我想編輯類,並獲得編輯類,這是我想要的。 OP有問題的理解並非所有看起來都是編輯控件的控件都是「編輯」類。 – user2120666

+1

我不認爲你真的明白你在這裏做什麼。誰說控制甚至是開窗。你已經找到了正確的解決方案,UI自動化。停止從它跑。 –

回答

1

主動輔助功能是正確的解決方案。您可以使用AccessibleObjectFromEvent()得到一個IAccessible接口以觸發您的winEventProcHWND,然後檢查的IAccessible::AccRole屬性:

ROLE_SYSTEM_TEXT
對象表示可選擇的文本,允許編輯或指定爲讀-只要。

例如:

// Callback set by SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, (WINEVENTPROC)&winEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS); 
void CALLBACK KeyboardComponent::winEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, 
    LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) 
{ 
    IAccessible* pAcc = NULL; 
    VARIANT varChild; 
    HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild); 
    if ((hr == S_OK) && (pAcc != NULL)) 
    { 
     VARIANT varRole; 
     hr = pAcc->get_accRole(varChild, &varRole); 
     if ((hr == S_OK) && (varRole.vt == VT_I4) && (varRole.lVal == ROLE_SYSTEM_TEXT)) 
     { 
      // ... 
     } 
     pAcc->Release(); 
    } 
} 
-2

您可以使用此代碼知道是否集中的窗口是Edit控件

CWnd* pControl; 
pControl = this->GetFocus(); 

if(pControl->IsKindOf(RUNTIME_CLASS(CEdit))){ 
     //---- 
     ----- 
     ----// 
} 

獲得更多詳細信息Here

轉換CwndHWND

pControl->GetSafeHwnd(); 
+1

這隻適用於如果您使用MFC,並且編輯問題的子類型爲 –

+1

...以及您自己的程序中的控件。鑑於這個人正在編寫一個可訪問性客戶端,三種情況都不是這種情況。 – andlabs

-1

對於可靠的結果,嘗試應該使用RealGetWindowClass處理窗口被分類的情況。如果你不關心那個使用常規GetClassName

如果你想處理不是從標準的編輯類派生的控件,當然這些都不會起作用。