Witam, zabrałem się dzisiaj za pisanie programu, który wykona kilka czynności za mnie.
Schemat jest taki:
-
otwórz plik tekstowy D:\a.txt w trybie usunięcia danych przy otwarciu
-
zawartość schowka zawierającego tekst wklej do powyższego pliku
-
zapisz i zamknij plik
-
otwórz program D:\konwerter002.exe
-
po 2 sekundach (czyli po czasie który jest mi potrzebny do przetworzenia a.txt) zamknij konwerter002.exe
-
otwórz plik tekstowy D:\b.txt w trybie zachowującym dane
-
skopiuj zawartość powyższego pliku do schowka
-
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ź