Нашел код... как говорят рабочий...
CODE:
//С аккселераторами, которые с клавишами-модификаторами, дополнительная фишка -
//посылки PostMessage недостаточно, нужно еще дополнительно обновить "keyboard
// input-state table" в нужном потоке.
//Вот такой код может сработать (закомментарены те части, без которых генерация
// аккселератора тоже произойдет).
HWND h = ::FindWindow(NULL, L"Безымянный - Блокнот");
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);
}
//С аккселераторами, которые с клавишами-модификаторами, дополнительная фишка -
//посылки PostMessage недостаточно, нужно еще дополнительно обновить "keyboard
// input-state table" в нужном потоке.
//Вот такой код может сработать (закомментарены те части, без которых генерация
// аккселератора тоже произойдет).
HWND h = ::FindWindow(NULL, L"Безымянный - Блокнот");
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);
}
Возникло несколько вопросов.
AttachThreadInput и attach в киборе одно и тоже?
Как мне вызвать SetKeyboardState(state); ?
Как написать 1 << 31 | 1 << 30
1<<31 я могу посчитать в калькуляторе и забить константами.
Но логики and, or, xor нету. Этого сильно не хватает и при проверке разных условий. Приходится писать многоэтажные каскады if.
(Добавление)
char state[256];
state[84]=128;
external(INT, "SetKeyboardState", "SetKeyboardState", "User32.dll"
SetKeyboardState(address(#state[0]));
Такая конструкция не работает. Похоже что-то не так пишу.