Bot korzystający z uchwytów

0

Witam, zabrałem się dzisiaj za pisanie programu, który wykona kilka czynności za mnie.
Schemat jest taki:

  1. otwórz plik tekstowy D:\a.txt w trybie usunięcia danych przy otwarciu

  2. zawartość schowka zawierającego tekst wklej do powyższego pliku

  3. zapisz i zamknij plik

  4. otwórz program D:\konwerter002.exe

  5. po 2 sekundach (czyli po czasie który jest mi potrzebny do przetworzenia a.txt) zamknij konwerter002.exe

  6. otwórz plik tekstowy D:\b.txt w trybie zachowującym dane

  7. skopiuj zawartość powyższego pliku do schowka

  8. zamknij powyższy plik

Wcześniej utworzony przeze mnie konwerter przerabia plik z jednego formatu na drugi i działa ok.
Teraz chcę napisać nowy program zgodny z powyższym schematem, który użyje mojego konwertera, a w dodatku wykona czynności związane ze schowkiem.
Wiem, że można scalić oba programy ale chcę wiedzieć jak zrobić coś takiego z zewnętrznym programem (tu konwerter002.exe).

Myślę już nad tym trochę i oto co mam korzystając z tego co znalazłem w necie:
I wersja korzystająca ze skrótów klawiatury:


#include <iostream>
#include <stdio.h>
#include <windows.h>




int main(int argc, char *argv[])
{
   
	TCHAR szCmdLine[ MAX_PATH ] = TEXT( "\"D:\\a.txt\"" );
	STARTUPINFO si = { sizeof( si ) };
	PROCESS_INFORMATION pi;
	HWND hwnd;

    // to uruchomi nasz program
    ::CreateProcess(
        NULL,
        szCmdLine,
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi );

  
    // poczeka do momentu az bedzie zaladowany i calkowicie
    // uruchomiony
    ::WaitForInputIdle( pi.hProcess, INFINITE );

    // czekamy 10 sekund
    ::Sleep( 10 * 1000 );



    keybd_event('CTRL' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska Ctrl
    keybd_event('A' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska A
    keybd_event('A' , 0, KEYEVENTF_KEYUP , 0); // puszcza A
    keybd_event('CTRL' , 0, KEYEVENTF_KEYUP , 0); // puszcza Ctrl

    keybd_event('CTRL' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska Ctrl
    keybd_event('V' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska V
    keybd_event('V' , 0, KEYEVENTF_KEYUP , 0); // puszcza V
    keybd_event('CTRL' , 0, KEYEVENTF_KEYUP , 0); // puszcza Ctrl

    keybd_event('CTRL' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska Ctrl
    keybd_event('S' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska S
    keybd_event('S' , 0, KEYEVENTF_KEYUP , 0); // puszcza S
    keybd_event('CTRL' , 0, KEYEVENTF_KEYUP , 0); // puszcza Ctrl

    keybd_event('ALT' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska Alt
    keybd_event('F4' , 0, KEYEVENTF_EXTENDEDKEY , 0); // wciska F4
    keybd_event('F4' , 0, KEYEVENTF_KEYUP , 0); // puszcza F4
    keybd_event('ALT' , 0, KEYEVENTF_KEYUP , 0); // puszcza Alt



    // teraz bierzemy sie za zamykanie
    // zaczniemy od zdobycia uchwytu okna
    hwnd = NULL;

    do
    {
        // teraz uwaga zaczynajac od NULL szukamy pierwszego
        // a pozniej kolejnego okna majacego nazwe klasy notepad
        hwnd = ::FindWindowEx( NULL, hwnd, TEXT( "Notepad" ), NULL );

    // i tak sobie szukamu do czasu az mamy jakis uchwyt
    // dla ktorego pzypadkiem pasuj nasz Id watku
    } while ( hwnd && ( ::GetWindowThreadProcessId( hwnd, NULL ) != pi.dwThreadId ) );

  
    if ( hwnd )
    {
      
        ::SendMessage( hwnd, WM_CLOSE, 0, 0 );
    }

    system("PAUSE");

	return 0;
}

II wersja korzystająca z uchwytów schowka windows
http://msdn.microsoft.com/en-us/library/ms649016(v=vs.85).aspx#_win32_Pasting_Information_from_the_Clipboard


#include <iostream>
#include <stdio.h>
#include <windows.h>




int main(int argc, char *argv[])
{
   
	TCHAR szCmdLine[ MAX_PATH ] = TEXT( "\"D:\\a.txt\"" );
	STARTUPINFO si = { sizeof( si ) };
	PROCESS_INFORMATION pi;
	HWND hwnd;

    // to uruchomi nasz program
    ::CreateProcess(
        NULL,
        szCmdLine,
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi );

  
    // poczeka do momentu az bedzie zaladowany i calkowicie
    // uruchomiony
    ::WaitForInputIdle( pi.hProcess, INFINITE );

    // czekamy 10 sekund
    ::Sleep( 10 * 1000 );




    char *d;
    OpenClipboard(NULL);
    d = (char*)GetClipboardData(1);
    puts(d);
    puts(d);
    CloseClipboard();



    // teraz bierzemy sie za zamykanie
    // zaczniemy od zdobycia uchwytu okna
    hwnd = NULL;

    do
    {
        // teraz uwaga zaczynajac od NULL szukamy pierwszego
        // a pozniej kolejnego okna majacego nazwe klasy notepad
        hwnd = ::FindWindowEx( NULL, hwnd, TEXT( "Notepad" ), NULL );

    // i tak sobie szukamu do czasu az mamy jakis uchwyt
    // dla ktorego pzypadkiem pasuj nasz Id watku
    } while ( hwnd && ( ::GetWindowThreadProcessId( hwnd, NULL ) != pi.dwThreadId ) );

  
    if ( hwnd )
    {
      
        ::SendMessage( hwnd, WM_CLOSE, 0, 0 );
    }

    system("PAUSE");

	return 0;
}

I tutaj potrzebna mi jest pomoc.

  • Testowałem wersję I ale nie chciało mi otworzyć mojego konwertera, chyba jest coś z zapisem ścieżki ale nie wiem
  • Sądzę że opcja II będzie lepsza ale nie ogarniam w ogóle uchwytów windowsowych i nie wiem jak to zorganizować żeby działało - czy ktoś pomoże mi to zorganizować?

ps. dodam w załączniku konwerter jakby chciał ktoś pokazać scaloną wersję z nowymi rzeczami
ps.2. nie wiem czy mój program to w ogóle bot, ale nie wiedzaiałem jak to nazwać, jak co poprawcie mnie:)

Dziękuję z góry za każdą wnoszącą coś odpowiedź

0

Zapis i odczyt pliku zrealizuj w języku C/C++ (nie potrzebujesz do tego notatnika).
Jeżeli zaś chcesz korzystać z tego notatnika to polecam AutoHotKey

0

Wydaje mi się, że nie o to mi chodzi. Obsługę plików potrafię zaimplementować, ale nadal nie wiem jak wdrożyć obsługę schowka za pomocą uchwytów? Poza tym nie wiem czy za pomocą AutoHotkey i jednego klawisza można wykonać te wszystkie czynności, które opisałem wcześniej.
Chcę po prostu program, który wszystko to robi. Czy ktoś ma jakiś pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1