CreateProcess & WaitForIdleInput



  • Hi,

    ich will einen process erzeugen und dann darauf warten das dieser bereit ist, jedoch löst wait for idle input zu früh für den process aus so das er die eingaben die dann an ihn geschikt werden 🙄 nicht verarbeitet, ich weiß das z.B. AutoIt da ne funktion hat die das hinkriegt, weiß da jemand rat wie ich das mache das er sich dann meldet wenn der prozess für eingaben bereit ist?


  • Mod

    Wie sendest Du die Eingaben? WaitForInputIdle macht es genau richtig.
    Wenn Du allerdings meinst mit SendMessage und WM_KEYDOWN Nachrichten Eingaben zu simulieren, dann mag das sicherlich so nicht gehen...
    http://blog.m-ri.de/index.php/2007/12/27/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren/



  • Ich emulier die tastendrücke mit SendInput _


  • Mod

    Dann werden die Eingabe auch gequeued und kommen an... Ansonsten könntest Du zusätzlich warten das Fenster des Prozess wirklich im Vordergrund liegt.



  • BOOL CALLBACK MyEnProcc( HWND hwnd, LPARAM lParam){
      CallParams * Call = (CallParams*)lParam;
      SetFocus(hwnd);
      short VK = 0;
      INPUT input;
      std::fill(reinterpret_cast < char* > ( &input ), reinterpret_cast < char* > ( &input )+sizeof(INPUT),0);
      input.type = INPUT_KEYBOARD;
      for ( unsigned int i = 0; i < Call->User.length(); i++ ){
        char Key = std::tolower(Call->User[i]);
        input.ki.wVk = VkKeyScanEx( Key, GetKeyboardLayout( NULL ) );
        SendInput(1,&input,sizeof(INPUT));
      }
      AttachThreadInput( GetCurrentThreadId(), Call->WoW.dwThreadId, false );
    return false;
    
    }
    
    Start ( std::string WoWPath, std::string DNS, std::string User, std::string Password ){
    
      CallParams * Call = new CallParams;
      Call->User = User;
      Call->Pass = Password;
      STARTUPINFO SInfo;
      std::fill ( (__int8*)&SInfo, (__int8*)&SInfo + sizeof(STARTUPINFO), 0);
      SInfo.cb = sizeof(STARTUPINFO);
      std::fill ( (__int8*)&Call->WoW, (__int8*)&Call->WoW + sizeof(PROCESS_INFORMATION), 0);
      BOOL bResult;
      bool Success = CreateProcess( ( WoWPath + (std::string)"\\wow.exe" ).c_str(), "", 0, 0, false, NORMAL_PRIORITY_CLASS, 0, 0, &SInfo, &Call->WoW );
      if ( Success ){
        WaitForInputIdle(Call->WoW.hProcess,INFINITE);
        if ( AttachThreadInput( GetCurrentThreadId(), Call->WoW.dwThreadId, true ) ){
         bResult = EnumThreadWindows( Call->WoW.dwThreadId, (WNDENUMPROC)MyEnProcc, (LPARAM)Call );
        }
    
      }
    }
    

    Hmm aber ürgentwas stimmt da noch nicht 😞


  • Mod

    Wenn Direct-Input verwendet wird funktioniert SendInput IMHO nicht.



  • *IMHO google* , Naja es funktioniert, das habe ich schon getestet. jedoch etwas zu früh, es erkennt die messages nur wenn ich dem progrmam selbst sage wann das fenster wirklich fertig ist im aufbau


Anmelden zum Antworten