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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2015, 22:46   #1
andrey_abc
 
Регистрация: 04.06.2015
Сообщений: 4
По умолчанию Имитировать нажатие ctrl+c и ctrl+v

У меня есть горячая клавиша Alt+b по ее нажатия программа выполняется,а как имитировать нажатие ctrl+c и ctrl+v или как получить выделенный текст с другого окна(блокнота допустим). Допустим я открыл блокнот выделил текст "ghbdtn" нажал alt+b и он стал "привет"
Код C++
Код:
    if (RegisterHotKey(
        NULL,
        1,
        MOD_ALT | MOD_NOREPEAT,
        0x42))  //0x42 is 'b'
    {
        printf("Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag\n");
    }
 
    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
            printf("WM_HOTKEY received\n");            

//вызов ctrl+c
 
//чтение текста из буфера обмена
CString fromClipboard;//в эту переменную сохраним текст из буфера обмена
 
char source[256]={"/0"}; //в эту переменную нужно записать текст, который в дальнейшем поместится в буфер обмена
if ( OpenClipboard(NULL) )//открываем буфер обмена
{
   HANDLE hData = GetClipboardData(CF_TEXT);//извлекаем текст из буфера обмена
   char* chBuffer= (char*)GlobalLock(hData);//блокируем память
   fromClipboard = chBuffer;
   GlobalUnlock(hData);//разблокируем память
   CloseClipboard();//закрываем буфер обмена
}
 
 
map<CString,char> autoswitch;
autoswitch.insert (pair<CString,char>('Q','Й'));
autoswitch.insert (pair<CString,char>('q','й'));
autoswitch.insert (pair<CString,char>('W','Ц'));
autoswitch.insert (pair<CString,char>('w','ц'));
autoswitch.insert (pair<CString,char>('E','У'));
autoswitch.insert (pair<CString,char>('e','у'));
autoswitch.insert (pair<CString,char>('R','К'));
autoswitch.insert (pair<CString,char>('r','к'));
autoswitch.insert (pair<CString,char>('T','Е'));
autoswitch.insert (pair<CString,char>('t','е'));
autoswitch.insert (pair<CString,char>('Y','Н'));
autoswitch.insert (pair<CString,char>('y','н'));
autoswitch.insert (pair<CString,char>('U','Г'));
autoswitch.insert (pair<CString,char>('u','г'));
autoswitch.insert (pair<CString,char>('I','Ш'));
autoswitch.insert (pair<CString,char>('i','ш'));
autoswitch.insert (pair<CString,char>('O','Щ'));
autoswitch.insert (pair<CString,char>('o','щ'));
autoswitch.insert (pair<CString,char>('P','З'));
autoswitch.insert (pair<CString,char>('p','з'));
...
autoswitch.insert (pair<CString,char>('Z','Я'));
autoswitch.insert (pair<CString,char>('z','я'));
autoswitch.insert (pair<CString,char>('X','Ч'));
autoswitch.insert (pair<CString,char>('x','ч'));
autoswitch.insert (pair<CString,char>('C','С'));
autoswitch.insert (pair<CString,char>('c','с'));
autoswitch.insert (pair<CString,char>('V','М'));
autoswitch.insert (pair<CString,char>('v','м'));
autoswitch.insert (pair<CString,char>('B','И'));
autoswitch.insert (pair<CString,char>('b','и'));
autoswitch.insert (pair<CString,char>('N','Т'));
autoswitch.insert (pair<CString,char>('n','т'));
autoswitch.insert (pair<CString,char>('M','ь'));
autoswitch.insert (pair<CString,char>('m','ь'));
autoswitch.insert (pair<CString,char>('<','Б'));
autoswitch.insert (pair<CString,char>(',','б'));
autoswitch.insert (pair<CString,char>('>','Ю'));
autoswitch.insert (pair<CString,char>('.','ю'));
 
for(i=0;i<fromClipboard.GetLength();i++)
    for(auto it=autoswitch.begin(); it!=autoswitch.end();it++)
        if(fromClipboard[i]==it->first)
        {source[i]=it->second;break;}
        else source[i]=fromClipboard[i];
 
        //CString source; 
//в эту переменную нужно записать текст, который в дальнейшем поместится в буфер обмена
//запись текста в буфер обмена
        CString sourcelast;
        sourcelast=source;
    DWORD CodePage=0x419;
if(OpenClipboard(NULL))//открываем буфер обмена
{
   HGLOBAL hgBuffer;
   char* chBuffer;
   EmptyClipboard(); //очищаем буфер
   hgBuffer= GlobalAlloc(GMEM_DDESHARE, sourcelast.GetLength()+1);//выделяем память
   chBuffer= (char*)GlobalLock(hgBuffer); //блокируем память
   strcpy(chBuffer, LPCSTR(sourcelast));
   HGLOBAL Data=GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE,4);
   char* DataPtr=(char*)GlobalLock(Data);
   memcpy(DataPtr,(const VOID*)&CodePage,4);
   GlobalUnlock(Data);//разблокируем память
   SetClipboardData(CF_LOCALE,Data);//помещаем текст в буфер обмена
   GlobalUnlock(hgBuffer);
   SetClipboardData(CF_TEXT, hgBuffer);
   CloseClipboard(); //закрываем буфер обмена
}
//вызов ctrl+v
        }
    } 
 
}

Последний раз редактировалось Stilet; 05.06.2015 в 07:19.
andrey_abc вне форума Ответить с цитированием
Старый 05.06.2015, 00:11   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Гарантированно надежного способа нет.
Попробуйте слать в окно блокнота последовательности WM_KEYDOW/WM_KEYUP
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод EOF c консоли - это Ctrl+Z и Ctrl+M Почему? 8Observer8 Общие вопросы по программированию, компьютерный форум 10 13.01.2023 09:33
отловить нажатие клавиши ctrl kaljan775 Общие вопросы C/C++ 4 31.10.2011 23:39
отловить нажатие клавиши ctrl kaljan775 Помощь студентам 0 30.10.2011 17:20
как отследить нажатие Ctrl+Shift v4567 Qt и кроссплатформенное программирование С/С++ 4 31.05.2011 18:42
за деньги напишите - отследить нажатие Ctrl+Shift v4567 Фриланс 0 29.05.2011 14:17