0

アプリケーションで文字配列を大文字に変換して、キーを押して渡すことができるようにしようとしています。このコードが機能するようになったことはわかっていますが、問題がわかりません。

            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;
 }

どんな助けでも素晴らしいでしょう!

編集:

このアプリケーションは、Web ページを開こうとしており、ログイン情報を入力して [送信] を押します (タブを使用してユーザー名、パスワード フィールドなどを選択します)。@Rup に応答し、このコード ブロックの上で初期化されますl[]p[]

        char l[180];
        char p[180];

l はユーザーのログイン名、p はパスワードです。これらを大文字に変換して、GenerateKey に渡しようとしています。例えばGenerateKey('A', FALSE);

現時点では、コードはキープレスをまったく渡していないように見えますが、アプリケーションがフリーズするため、どこかで for ループに陥っていると思います。

編集2:

役立つコードを提供してくれた @William に感謝します。toUpper 関数を使用して、この問題の解決に非常に近づいています。私が今抱えている唯一の問題は、渡されるログインとパスワードに余分な文字が含まれていることです。たとえば、login as をusername渡すと、プログラムを再実行しuser、出力を取得するときにlogin を渡します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);すると、私が抱えていたすべての問題が解決されました。

4

2 に答える 2

1
void toUpper(char* pArray, int arrayLength)
{
    for(int i = 0; i < arrayLength; i++)
    {
        if(pArray[i] >= 'a' && pArray[i] <= 'z')
            pArray[i] -= ' ';
    }
}
于 2012-05-09T09:49:13.573 に答える
1

次のコードで問題を解決しました。

コードはコメントで説明されています。

        // 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 関数も必要です。

この問題についてご協力いただきありがとうございます。

于 2012-05-10T08:33:27.387 に答える