На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> WM_KEYDOWN
    Цитата Duke Nuken @
    Вау. Я проникся. А вообще поработав с С# 2 года похоже тупееш :)
    Вот накидал сообщения для Alt + A (выдедение текста в блокноте)
    и оно в точности повторяет то что происходит при нажатии с клавиатуры,
    за отличием одного - не работает. В чем подвох?

    ExpandedWrap disabled
          HWND h = ::FindWindow(NULL, L"1.txt - Notepad");
       
          if (h != NULL)
          {
              HWND child = ::FindWindowEx(h,NULL,L"Edit", NULL);
       
       
              UINT lparam_Ctrl1 = ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ;
              UINT lparam_A1 = ::MapVirtualKey((int)'A', 0) << 16 | 1 ;
              
              UINT lparam_A2 = 1 << 31 | 1 << 30 | ::MapVirtualKey((int)'A', 0) << 16 | 1 ;
              UINT lparam_Ctrl2 = 1 << 31 | 1 << 30 | ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ;
              
              //Ctrl + A
              LRESULT pl1_Ctrl = ::PostMessage(child, WM_KEYDOWN, VK_CONTROL, lparam_Ctrl1 );
              LRESULT pl1_A = ::PostMessage(child, WM_KEYDOWN, (int)'A', lparam_A1 );
              
              LRESULT pl2_A = ::PostMessage(child, WM_KEYUP, (int)'A', lparam_A2);
              LRESULT pl2_Ctrl = ::PostMessage(child, WM_KEYUP, VK_CONTROL, lparam_Ctrl2);        
          }

    И что Spy`ем смотрел - один в один с клавиатурой?

    Добавлено
    Более того - у меня даже после твоих сообщений посылает WM_CHAR!!!
      Я тоже заметил этот побочный эффект :)
      Но ты можеш мне показать WM_CHAR в коде?
      Почему он происходит, а выделение текста не отрабатывает - вот в чем загадка.

      Да Spy++ смотрел - один в один с клавиатурой.
      Я подозреваю там еще какието события нужно посылать чтобы заработало.
      Сообщение отредактировано: Duke Nuken -
        Акселератор не срабатывает, поэтому и WM_KEYDOWN + WM_KEYUP преобразуются в WM_CHAR. Если послать сообщение напрямую с ID=25, то все происходит.
        ExpandedWrap disabled
              HWND h = ::FindWindow(NULL, L"Безымянный - Блокнот");
           
              if (h != NULL)
              {
                  LRESULT pl1_Ctrl = ::PostMessage(h, WM_COMMAND, 0x10019, 0x0 );
              }
          Цитата evGenius @
          Акселератор не срабатывает, поэтому и WM_KEYDOWN + WM_KEYUP преобразуются в WM_CHAR. Если послать сообщение напрямую с ID=25, то все происходит.
          ExpandedWrap disabled
                HWND h = ::FindWindow(NULL, L"Безымянный - Блокнот");
             
                if (h != NULL)
                {
                    LRESULT pl1_Ctrl = ::PostMessage(h, WM_COMMAND, 0x10019, 0x0 );
                }

          Не знаю. У меня не работает, хотя идея вроде как правильная.
            Цитата Duke Nuken @
            Я тоже заметил этот побочный эффект :)
            Но ты можеш мне показать WM_CHAR в коде?
            Почему он происходит

            Блин, последний мой пост в данной ветке. >:( Я тут для кого распиняюсь? Не посмотреть было про упомянутую TranslateMessage() ?

            Цитата MSDN: TranslateMessage
            WM_KEYDOWN and WM_KEYUP combinations produce a WM_CHAR or WM_DEADCHAR message.


            Цитата
            а выделение текста не отрабатывает

            С аккселераторами, которые с клавишами-модификаторами, дополнительная фишка - посылки PostMessage недостаточно, нужно еще дополнительно обновить "keyboard input-state table" в нужном потоке.
            Вот такой код может сработать (закомментарены те части, без которых генерация аккселератора тоже произойдет). Разбирайся сам, раз не желаешь слушать.
            ExpandedWrap disabled
                  if (h != NULL)
                  {
                      HWND child = ::FindWindowEx(h,NULL,"Edit", NULL);
               
                      UINT lparam_Ctrl1 = ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ;
                      UINT lparam_A1 = ::MapVirtualKey((int)'A', 0) << 16 | 1 ;
               
                      UINT lparam_A2 = 1 << 31 | 1 << 30 | ::MapVirtualKey((int)'A', 0) << 16 | 1 ;
                      UINT lparam_Ctrl2 = 1 << 31 | 1 << 30 | ::MapVirtualKey(VK_CONTROL, 0) << 16 | 1 ;
               
                      DWORD pid;
                      DWORD tid = GetWindowThreadProcessId(child, &pid);
                      HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pid);
                      //Ctrl + A
               
                      AttachThreadInput(GetCurrentThreadId(), tid, TRUE);
               
                      LRESULT pl1_Ctrl = ::PostMessage(child, WM_KEYDOWN, VK_CONTROL, lparam_Ctrl1 );
                      WaitForInputIdle(hProc, INFINITE);
               
                      BYTE state[256];
                      GetKeyboardState(state);
                      state[VK_CONTROL] = 0x80;
                      SetKeyboardState(state);
               
                      LRESULT pl1_A = ::PostMessage(child, WM_KEYDOWN, (int)'A', lparam_A1 );
                      WaitForInputIdle(hProc, INFINITE);
              /*
                      GetKeyboardState(state);
                      state['A'] = 0x80;
                      SetKeyboardState(state);
              */
               
                      LRESULT pl2_A = ::PostMessage(child, WM_KEYUP, (int)'A', lparam_A2);
                      WaitForInputIdle(hProc, INFINITE);
              /*
                      GetKeyboardState(state);
                      state['A'] = 0x0;
                      SetKeyboardState(state);
              */
               
                      LRESULT pl2_Ctrl = ::PostMessage(child, WM_KEYUP, VK_CONTROL, lparam_Ctrl2);        
                      WaitForInputIdle(hProc, INFINITE);
              /*
                      GetKeyboardState(state);
                      state[VK_CONTROL] = 0x0;
                      SetKeyboardState(state);
              */
               
                      AttachThreadInput(GetCurrentThreadId(), tid, FALSE);
               
                  }
            Сообщение отредактировано: Hryak -
              Hryak - гений! Код работает.
                Всем доброе время суток.
                У меня такой вопрос.

                Нужно симулировать нажатие [ENTER] во внешней апликации, когда апликация не имеет фокуса.

                Когда сам нажимаю [ENTER] и смотрю через Spy то вижу следуюшее три строчки

                <0001> 01160386 P WM_KEYDOWN nVirtKey: VK_RETURN cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:001C0001]
                <0002> 01160386 P WM_CHAR chCharCode:"(13) cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:001C0001]
                <0003> 01160386 P WM_KEYUP nVirtKey: VK_RETURN cRepeat:1 ScanCode:1C fExtended:0 fAltDown:0 fRepeat:1 fUp:1 [wParam:0000000D lParam:C01C0001]


                Вот мой код.
                ExpandedWrap disabled
                          Const VK_RETURN = &HD
                          Const WM_KEYDOWN = &H100
                          Const WM_KEYUP = &H101
                          Const WM_CHAR = &H102
                   
                          Result = SendMessage(WindhWnd, WM_KEYDOWN, VK_RETURN, &H1C0001)
                          Result = SendMessage(WindhWnd, WM_CHAR, VK_RETURN, 1)
                          Result = SendMessage(WindhWnd, WM_KEYUP, VK_RETURN, &H1C0001)


                И это код даёт следуюший результат Spy (как такового нажатия не происходит)

                <0001> 01160386 S WM_KEYDOWN nVirtKey: VK_RETURN cRepeat:62206 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:0013F304]
                <0002> 01160386 R WM_KEYDOWN lResult:00000001
                <0003> 01160386 S WM_CHAR chCharCode:"(13) cRepeat:62206 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:0013F2FE]
                <0004> 01160386 R WM_CHAR lResult:00000000
                <0005> 01160386 S WM_KEYUP nVirtKey: VK_RETURN cRepeat:62212 ScanCode:13 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:0000000D lParam:0013F304]
                <0006> 01160386 R WM_KEYUP lResult:00000000


                Вопрос 1)Сразу видно что я напортачил с lParam.
                Неподскажите как его высчитывать.

                Вопрос 2) Что обозначают след буквы P S R (Spy)
                Могу предположить PostMessage SendMessage Result
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                [ Script Execution time: 0,0976 ]   [ 15 queries used ]   [ Generated: 6.12.14, 22:46 GMT ]  

                Rambler's Top100