2015-01-06 5 views
0

У меня есть главное окно hwndMain и многострочный Edit текстовое поле:Detect CTRL + A в texbox

hwndEdit = CreateWindowEx(0, L"EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 300, 200, hwndMain, 0, (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL); 

я использую это для обнаружения CTRL + в текстовом поле (потому, что как ни странно, это не доступны вне коробки):

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_KEYDOWN: 
     { 
      if (wParam == VK_CONTROL) // something here missing for detecting "A" 
      { 
       SendMessage(hwndEdit, EM_SETSEL, 0, -1); // select all ; this code works on its own, tested 
      } 
      ... 

к сожалению, ничего не происходит, когда я CTRL +A или CTRL + B или CTRL + ничего.

Что не так?

Примечание: Ok код для обнаружения А еще не хватает (я до сих пор не знаю, как это сделать), но код здесь должен работать на любой CTRL + ключ ...

+0

Стандартный Edit контроль будет обрабатывать Ctrl + A уже. Не сломайте его, и вам не придется его переопределять. – IInspectable

+0

Сообщение WM_KEYDOWN отправляется в элемент управления редактирования, а не в ваше окно. –

+0

Обязательное чтение: [About Keyboard Input] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267.aspx), если вы хотите переопределить реализацию по умолчанию (выбрав весь контент, в некоторых местах). – IInspectable

ответ

1

Просто проверьте WM_KEYDOWN для а и чем использовать GetKeyState

case WM_KEYDOWN: 
    { 
    if (wParam=='A' && (::GetKeyState(VK_CONTROL) & 0x8000)!=0) 
    { 
     SendMessage(hwndEdit, EM_SETSEL, 0, -1); // select all 
    } 

Помните, что WM_KEYDOWN отправляется только к окну, которое имеет фокус, а не родительские окна.

+0

Не работает. Кстати, я даже попробовал «случай WM_KEYWDOWN: {MessageBox (...); } ', но ничего не происходит: кажется, что' WM_KEYDOWN' не запускается * для главного окна * вообще, когда я пишу в текстовом поле «Редактировать» ... Почему? – Basj

+0

@Basj: * «Помните, что WM_KEYDOWN отправляется только в окно с фокусом, а не с родительскими окнами». * – IInspectable

+0

Должен ли я иметь две функции LRESULT CALLBACK WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam), тогда ? Один для главного окна и второй для окна редактирования? Разве нет способа сделать это только с одним @ невозможно? – Basj

1

После создания всех окон:

hwndEdit = CreateWindowEx(.....) 
... 

//Subbclassing 
SetWindowSubclass(hwndEdit, (SUBCLASSPROC)EditWndProc, 0, 1); 


LRESULT CALLBACK EditWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwrefData){ 

    switch(message){ //handle the messages 
     case WM_KEYDOWN: 
      //your code 

      break; 
     default: //for messages that we don't deal with 
      return DefSubclassProc(hwnd, message, wParam, lParam); 
    } 

    return DefSubclassProc(hwnd, message, wParam, lParam); 
} 
+0

@xMRi и γηράσκωδ'αείπολλάδιδασκόμε: Соединение ** обоих ** ваши ответы решают проблему. Кого я должен принять? Дилемма! – Basj

+0

@Basj На ваш вопрос ответил xMRi, поэтому он должен его получить. Я просто помог вам с * Подклассификацией *. –

+0

Большое спасибо! – Basj

Смежные вопросы