Получение выделенного текста из активного окна с помощью С++

У меня есть приведенный ниже код, в котором я пытаюсь получить выделенный текст из активных окон и распечатать его на консоли.

DWORD new12=0;
KEYBDINPUT* input = new KEYBDINPUT[key_count];
    if( GetGUIThreadInfo( new12, lpgui ) )
{
    target_window = lpgui->hwndFocus;
}
else
{
   // You can get more information on why the function failed by calling
   // the win32 function, GetLastError().
   std::cout<<"error1";
}
// We're sending two keys CONTROL and 'V'. Since keydown and keyup are two
// seperate messages, we multiply that number by two.

for( int i = 0; i < key_count; i++ )
{
    input[i].dwFlags = 0;
    //input[i].type = INPUT_KEYBOARD;
}

input[0].wVk = VK_CONTROL;
input[0].wScan = MapVirtualKey( VK_CONTROL, MAPVK_VK_TO_VSC );
input[1].wVk = 0x56; // Virtual key code for 'v'
input[1].wScan = MapVirtualKey( 0x56, MAPVK_VK_TO_VSC );

У меня есть приведенный выше код С++, но, похоже, он выдает ошибку, говорящую «error: MAPVK_VK_TO_VSC' was not declared in this scope» в строке input[0].wScan = MapVirtualKey( VK_CONTROL, MAPVK_VK_TO_VSC ); Интересно, в чем здесь проблема. Я не думаю, что эта ошибка появляется из-за каких-либо проблем с объявлением. Не могли бы вы помочь мне здесь? Спасибо.


person Rigorous implementation    schedule 12.05.2013    source источник
comment
Используйте специальные интерфейсы. Вот для чего они.   -  person Raymond Chen    schedule 12.05.2013
comment
@Raymond Chen Я использую jgrasp. Как использовать интерфейс специальных возможностей??   -  person Rigorous implementation    schedule 12.05.2013
comment
Это большая тема, чем может охватить один вопрос SO. Вы можете прочитать документацию по специальным возможностям в MSDN. Вы, вероятно, в конечном итоге будете использовать TextPattern.GetSelection.   -  person Raymond Chen    schedule 12.05.2013


Ответы (1)


MAPVK_VK_TO_VSC — это просто #define MAPVK_VK_TO_VSC (0), даже не константа, поэтому ее нужно разрешить на этапе препроцессинга.

Либо вы не включили "winuser.h" перед этим кодом (в этом случае константы MapVirtualKey и VK_ тоже будут необъявленными), либо у вас где-то неопределенный WIN_VER (или он определен меньше 0x400). Иногда легко забыть, что WIN_VER должен быть определен в шестнадцатеричном формате, и с чем-то вроде #define WINVER 500 у вас есть версия меньше 2.0.

person Mike Tyukanov    schedule 12.05.2013
comment
Я включил заголовок и win_ver, но все равно ошибка выскакивает.. Мне серьезно интересно, в чем проблема. должен ли я жестко закодировать значение MAPVK_VK_TO_VSC равным 0? - person Rigorous implementation; 13.05.2013
comment
Посмотрите в своем файле winuser.h, если вы найдете какие-либо случаи MAPVK_VK_TO_VSC. Вероятно, у вас действительно старый SDK, в котором MAPVK_VK_TO_VSC не был определен. - person Jabberwocky; 13.05.2013
comment
Да, имеет смысл жестко закодировать 0 и посмотреть, что тогда произойдет. Я бы также добавил cout<<"WIN_VER is "<<hex<<WIN_VER<<endl;, просто чтобы убедиться, что никакие другие параметры заголовка или компилятора не сбрасывают его. - person Mike Tyukanov; 13.05.2013