С++ преобразовать массив символов в верхний регистр (без MFC)

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

            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); в приведенном выше коде устранило все проблемы, которые у меня были.


person L337BEAN    schedule 09.05.2012    source источник
comment
В вашем случае не isalpha вы используете l[a] uninitialized. Но вам нужно будет предоставить нам более подробную информацию о том, что работает / не работает - вы вообще можете это отлаживать? А login[] символы ASCII или коды ВК? Вы, кажется, смешиваете два.   -  person Rup    schedule 09.05.2012
comment
А в чем собственно вопрос?   -  person juanchopanza    schedule 09.05.2012
comment
Извините, я отредактировал свой вопрос, чтобы предоставить больше информации.   -  person L337BEAN    schedule 09.05.2012
comment
пожалуйста, дайте минимальный компилируемый пример, включая main(), показывающий ошибку.   -  person TemplateRex    schedule 09.05.2012
comment
Спасибо, но это означает, что l[a] не инициализируется. (Нет неявного init-to-0, если только они не являются глобальными переменными.) Я имел в виду, что вы вызываете GenerateKey(l[a], FALSE); перед строкой, которая устанавливает l[a]. Вы должны быть в состоянии определить, где он зависает в отладчике.   -  person Rup    schedule 09.05.2012
comment
@Rup Вы правы, однако я использовал функцию Вильямса, чтобы сделать код немного аккуратнее. У меня все еще есть проблемы с передачей ключей. Детали были добавлены к вопросу.   -  person L337BEAN    schedule 09.05.2012
comment
Последнее редактирование: потому что вы испускаете весь массив входа. Вы должны остановиться при первом чтении 0.   -  person Rup    schedule 09.05.2012
comment
@Руп. Извините, но я не очень понимаю, что вы говорите. При использовании login[a]='0'; кажется, что он просто отрезает 1 символ от более старого, более длинного входа в систему и печатает остальное.   -  person L337BEAN    schedule 09.05.2012
comment
А, я решил проблему. sizeof(login) в данном случае не работал. Вместо этого использование strlen(login) обеспечивает правильную длину и решает проблему.   -  person L337BEAN    schedule 09.05.2012
comment
Да, либо так, либо for(a=0; (login[a] != 0) && (a<sizeof(login)); a++) тоже сработает.   -  person Rup    schedule 09.05.2012


Ответы (2)


Я решил проблему с помощью следующего кода:

Код объяснен в комментариях.

        // Convert to uppercase to be passed as keypresses
        toUpper(login, sizeof(login));
        toUpper(pass, sizeof(pass));
        int a;
        // Loop through the character array and send the key presses
        for(a=0; a<strlen(login);a++){
            GenerateKey(login[a], FALSE);}
        GenerateKey(0x09, FALSE);
        for(a=0; a<strlen(pass);a++){
            GenerateKey(pass[a], FALSE);}
        // Additional keypresses
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x09, FALSE);
        Sleep(1000);
        GenerateKey(0x0D, FALSE);

Предоставленные функции GenerateKey и toUpper также необходимы для правильной работы этого кода.

Спасибо за вашу помощь в этом вопросе.

person L337BEAN    schedule 10.05.2012

person    schedule
comment
пожалуйста, сделайте что-то вроде этого: pArray[i] >= 'a' && pArray[i] <= 'z') и тому подобное для задания. - person Yuri; 09.05.2012
comment
Спасибо за этот код. У меня все еще есть небольшая проблема. Я обновил свой исходный вопрос с деталями. - person L337BEAN; 09.05.2012