Я пытаюсь заставить свое приложение преобразовать массив символов в прописную букву, чтобы я мог передавать их как нажатия клавиш. Я знаю, что близок к тому, чтобы этот код заработал, но я просто не вижу проблемы.
int a, b, c, d;
char text[25];
char upper[25];
for (a = 0, b = sizeof(login); a < b; a++)
{
if (isalpha(login[a])){
l[a] = toupper(login[a]);
Sleep(1000);
GenerateKey(l[a], FALSE);}
else{
GenerateKey(l[a], FALSE);
Sleep(1000);
l[a] = login[a];}
}
login[a]='\0';
GenerateKey(0x09, FALSE);
for (c = 0, d = sizeof(pass); c < d; c++)
{
if (isalpha(pass[c])){
p[c] = toupper(pass[c]);
GenerateKey(p[c], FALSE);
Sleep(1000);}
else{
GenerateKey(p[c], FALSE);
p[c] = pass[c];
Sleep(1000);}
}
pass[a]='\0';
GenerateKey(0x09, FALSE);
Sleep(1000);
GenerateKey(0x09, FALSE);
Sleep(1000);
GenerateKey(0x0D, FALSE);
А вот функция GenerateKey:
void GenerateKey(int vk, BOOL bExtended) {
KEYBDINPUT kb = {0};
INPUT Input = {0};
/* Generate a "key down" */
if (bExtended) { kb.dwFlags = KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
/* Generate a "key up" */
ZeroMemory(&kb, sizeof(KEYBDINPUT));
ZeroMemory(&Input, sizeof(INPUT));
kb.dwFlags = KEYEVENTF_KEYUP;
if (bExtended) { kb.dwFlags |= KEYEVENTF_EXTENDEDKEY; }
kb.wVk = vk;
Input.type = INPUT_KEYBOARD;
Input.ki = kb;
SendInput(1, &Input, sizeof(Input));
return;
}
Любая помощь будет здорово!
ИЗМЕНИТЬ:
Это приложение пытается открыть веб-страницу, а затем ввести данные для входа и нажать «Отправить» (используя вкладку для выбора полей имени пользователя, пароля и т. д.). Чтобы ответить @Rup, над этим блоком кода инициализируются l[]
и p[]
.
char l[180];
char p[180];
l — это имя пользователя, а p — его пароль. Я пытаюсь преобразовать их в верхний регистр, чтобы передать их в GenerateKey. например GenerateKey('A', FALSE);
На данный момент код, похоже, вообще не передает никаких нажатий клавиш, но приложение зависает, поэтому я считаю, что оно где-то застревает в цикле for.
РЕДАКТИРОВАТЬ 2:
Спасибо @William за предоставление полезного кода. Используя функцию toUpper, я очень близок к решению этой проблемы. Единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что передаваемые логин и пароль содержат лишние символы. Например, если я передам логин как username
, затем перезапущу программу и передам логин как user
, я получу вывод userame
.
Это код, который у меня есть сейчас с функциями GenerateKey и toUpper:
// Convert to uppercase to be passed as keypresses
toUpper(login, sizeof(login));
toUpper(pass, sizeof(pass));
int a;
for(a=0; a<sizeof(login);a++){
GenerateKey(login[a], FALSE);}
login[a]='\0';
GenerateKey(0x09, FALSE);
a=0;
for(a=0; a<sizeof(pass);a++){
GenerateKey(pass[a], FALSE);}
pass[a]='\0';
GenerateKey(0x09, FALSE);
Sleep(1000);
GenerateKey(0x09, FALSE);
Sleep(1000);
GenerateKey(0x0D, FALSE);
РЕШЕНИЕ:
Использование strlen(login);
в приведенном выше коде устранило все проблемы, которые у меня были.
l[a]
uninitialized. Но вам нужно будет предоставить нам более подробную информацию о том, что работает / не работает - вы вообще можете это отлаживать? А login[] символы ASCII или коды ВК? Вы, кажется, смешиваете два. - person Rup   schedule 09.05.2012GenerateKey(l[a], FALSE);
перед строкой, которая устанавливаетl[a]
. Вы должны быть в состоянии определить, где он зависает в отладчике. - person Rup   schedule 09.05.2012login[a]='0';
кажется, что он просто отрезает 1 символ от более старого, более длинного входа в систему и печатает остальное. - person L337BEAN   schedule 09.05.2012sizeof(login)
в данном случае не работал. Вместо этого использованиеstrlen(login)
обеспечивает правильную длину и решает проблему. - person L337BEAN   schedule 09.05.2012for(a=0; (login[a] != 0) && (a<sizeof(login)); a++)
тоже сработает. - person Rup   schedule 09.05.2012