Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2010, 14:47   #1
Razlo
Новичок
Джуниор
 
Регистрация: 26.08.2010
Сообщений: 1
По умолчанию Эмуляция нажатия клавиш в свернутом окне на уровне драйвера

Всем привет. Помогите, пожалуйста, с такой вот задачей. Есть код на C++, который осуществляет успешную отправку клавиш в свернутое приложение.
Код отсылает клавиши 1 и 2 по очереди с перерывом в 3 секунды.

Вопрос: как сделать так, чтоб осуществлялось это через ПОЛНУЮ эмуляцию нажатия на кнопки клавиатуры, т.е на уровне драйвера?

Код:
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <stdio.h>

HWND      g_hWnd                = NULL;
HWND      wowWND                = NULL;
bool      actFlag               = false;
bool      key                   = false;

HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow)
{

  if (FAILED(InitWindow(hInstance, nCmdShow)))
    return 0;

  SetTimer(g_hWnd, 1, 3000, NULL);
  MSG msg = {0};
  while (GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  
  KillTimer(g_hWnd, 1);

  return (int) msg.wParam;
}

HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow)
{
  // register window class
  WNDCLASSEX wc;
  wc.cbSize         = sizeof(WNDCLASSEX);
  wc.style          = CS_HREDRAW|CS_VREDRAW;
  wc.lpfnWndProc    = WndProc;
  wc.cbClsExtra     = 0;
  wc.cbWndExtra     = 0;
  wc.hInstance      = hInstance;
  wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
  wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszMenuName   = NULL;
  wc.lpszClassName  = L"SimpleWindowClass";
  wc.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

  if (!RegisterClassEx(&wc))
    return E_FAIL;

  // create window
  g_hWnd = CreateWindow(
    L"SimpleWindowClass",
    L"Поиск путей Bug2",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    640,
    480,
    NULL,
    NULL,
    hInstance,
    NULL);

  if (!g_hWnd)
    return E_FAIL;

  //ShowWindow(g_hWnd, nCmdShow);

  //UpdateWindow(g_hWnd);

  return S_OK;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {

  case WM_DESTROY:
    PostQuitMessage(0);
    break;

  case WM_TIMER:
    
    if (!wowWND)
    {
      wowWND = FindWindow(NULL, L"World of Warcraft");
      if (wowWND)
        actFlag = true;
      else
        wowWND = FindWindow(NULL, L"Wow");

      if (wowWND)
        actFlag = true;
    }
    if (actFlag)
      if (key)
      {
        SendMessage(wowWND, WM_CHAR, '1', 0);
        key = false;
      }
      else
      {
        SendMessage(wowWND, WM_CHAR, '2', 0);
        key = true;
      }
    break;

  default:
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
Razlo вне форума Ответить с цитированием
Старый 26.08.2010, 14:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

присмотритесь к SendInput.
а вообще драйвер врать не имеет права.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.08.2010, 19:50   #3
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Вы смогли бы прокоментировать этот листинг пожалуста
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 26.08.2010, 20:08   #4
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

а чего там комментить то?
по таймеру (каждые 3 секунды) ищет окно "World of Warcraft" или "Wow" и посылает ему в зависимости от флага символ либо "1" либо "2", флаг выбирается в зависимости от найденного окна
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция действий мыши в свернутом окне senia Win Api 12 18.11.2010 16:38
Эмуляция нажатия клавиши в неактивном окне Ga-sergey Общие вопросы Delphi 6 27.05.2010 23:21
Эмуляция нажатия CTRL-V в чужом окне ]Wowan[ Общие вопросы Delphi 0 25.04.2009 18:42
Эмуляция нажатия нескольких клавиш -=Shad0www Общие вопросы Delphi 3 12.05.2008 08:13