У меня есть горячая клавиша Alt+b по ее нажатия программа выполняется,а как имитировать нажатие ctrl+c и ctrl+v или как получить выделенный текст с другого окна(блокнота допустим). Допустим я открыл блокнот выделил текст "ghbdtn" нажал alt+b и он стал "привет"
Код:
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
}
}
}