wyslanie wiadomosci do okna programu z ktorego byl start !

0

czesc, mam taki problem, pisze programik do grafiki ktory ma szybko sie uruchamiac i rownie szybko po zrobieniu swojego zamykac sie. Jednak po zamknieciu programu i zwroceniu focusa ma wpisac w to okno do ktorego wroci jakis tekst. W kazdym razie program uruchamia sie w kazdym momencie, poprzez klawisz skrotu - windowsowa opcja, dla elementow z pulpitu.
Przyklad pisze sobie cos w notatniku, nagle uruchamiam program klawiszem skrotu, program robi swoje i po wyjsciu z niego, jak focus wroci do notatnika, a dokladnie jego okna Edit ma wypisac tekst.
Do tej pory udalo mi sie najpierw dobrac do Notatnika, pobierajac w programie okno -> GetWindow(GW_HWNDNEXT) i nastepnie jego child -> GetWindow(GW_CHILD). I dzialalo ok, tylko ze nie kazdy program ma taka strukture okien. Inny sposob ktory uzylem: sprawdzenie wszystkich dzieci tego programu, np. notatnika. I w ten sposob udalo sie wyslac tekst do Notatnika, Visuala, czy programu UltraEdit (program typu MDI, z dokumentami). Tekst wysylam funkcja PostMessage(). najpierw robilem za pomoca WM_CHAR, teraz jako WM_KEYDOWN i WM_KEYUP, bo to pierwsze nie wszedzie hulalo.
W kazdym razie nie podoba mi sie ten drugi sposob, chyba przekombinowany, i nie daje rady wszystkim programom, a pierwszy niewystarczajacy (dzialal tylko na Notatnik, z tych na ktorych testowalem).
Szukam funkcji API, MFC, lub lepszego sposobu - (pisze w VisualStudio 6), ktore pozwola mi "latwo i przyjemnie" uzyskac wskaznik, dostep do tego okna (Edita) w ktorym potem bede mogl wpisac tekst, czyli okno majace ostatni focus, ale nie jako program (Notatnik) tylko konkretne okno. Czyli najlepiej jakby istniala funkcja typu

pobranie okna z ktorego startowalem, np. notatnika
CWnd* wnd GetWindow(GW_HWNDNEXT); <- to stosuje

i cos jak:
CWnd* wnd_poszukawane = wnd->GetLastActiveWindow(); <- z tym ze takiej nie ma w MFC

prosze o pomoc i dzieki,
pozdrawiam

0

jesli dobrze zrozumialem, to mozesz zrobic symulacje pisania dzieki funkcji api
keybd_event(klawisz,0,0,0); //nacisniecie
keybd_event(klawisz,0,KEYEVENTF_KEYUP,0); //zwolnienie

0

dzieki,
nie chodzi mi o funkcje ktory "wysle tekst, badz znak - wiadomosc", lecz funckje ktora zwroci mi wskaznik do okna (Edita) ktory posiadal focus, zanim uruchomilem program, i do ktorego ten focus wroci (bo wraca) po zamknieciu okna, pozdrawiam

0

może po prostu keybd_event(ALT+TAB) a potem GetForegroundWindow ? Przełącza na ostatnie okno !?!

0

Spróbuj z GetNextWindow. Nie mam pojęcia czy to dotyczy okien jako okien, czy jako z-order "graficznie", ale spróbować możesz...
Sam bym sprawdził jak to działa, ale zaraz koniec semestru i muszę się dzisz jeszcze choć z godzinkę pouczyć... :(

{ADD}
Ale coś mi się przysniło własnie...
Może zdarzenie WM_SETFOCUS... Dostaje je okno, które focus otrzymało. W parametrze wParam zapisany jest wtedy uchwyt poprzedniego jego właściciela (albo NULL)
Jeżeli twój progz bierze focus, to zawsze warto spróbować...

Nawet mam fragmencik z najukochańszego helpa pod win:) [Win32 Programmer's Reference]:

The WM_SETFOCUS message is sent to a window after it has gained the keyboard focus. 

WM_SETFOCUS  
hwndLoseFocus = (HWND) wParam; // handle of window losing focus 
0

panowie !, dzieki za pomoc, podrzuciliscie mi niezle pomysly, posprawdzalem i oto wynik, wazne ze dziala :D
przykladowo wypisze literke "e"
np. dzialam w notatniku i nagle uruchamiam moj program, tuz przed wyjsciem przeskakuje do notatnika pisze "e" i wraca do mojego programu zeby go zamknac, jakby nigdy nic ;)

::keybd_event(VK_MENU,1,0,0); //nacisniecie
::keybd_event(VK_TAB,1,0,0); //nacisniecie

::keybd_event(VK_TAB,1,KEYEVENTF_KEYUP,0); //zwolnienie
::keybd_event(VK_MENU,1,KEYEVENTF_KEYUP,0); //zwolnienie

::keybd_event(VkKeyScan('E'), 1, 0, 0);
::keybd_event(VkKeyScan('E'), 1, KEYEVENTF_KEYUP, 0);

::keybd_event(VK_MENU,1,0,0); //nacisniecie
::keybd_event(VK_TAB,1,0,0); //nacisniecie

::keybd_event(VK_TAB,1,KEYEVENTF_KEYUP,0); //zwolnienie
::keybd_event(VK_MENU,1,KEYEVENTF_KEYUP,0); //zwolnienie

jeszcze raz wielkie dzieki i pozdrawiam ;)

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