Witam,
mam pytanie, jak w Delphi wysłać komunikat do aplikacji o nazwie (w Menadżerze Urządzeń) app.exe, który przesunie formę aplikacji. CZytałem o komunikatach, ale nie bardzo wiem, jak pobrać uchwyt aplikacji
Cytując MiśkaD, powiem "Oczywiście szukałem i oczywiście nigdzie nie było!!". Weź się człowieku ogarnij, i wpisz w googla "Jak pobrać uchwyt innej aplikacji delphi" i masz spokój.
Nie będę chamski i dam ci linka, FindWindow();
Próbowałem czegoś takiego:
var
h:HWND;
begin
h:=FindWindow(nil, PChar('notepad.exe'));
SendMessage(h,WM_MOVE,100,100);
i nie działa
Oczywiście t.r. chciał zabłysnąc, ale nie bardzo mu się udało. Gdzie tobie do Miśka chłopie, a poza tym podajesz coś co szuka okna po tytule lub klasie, a nie nazwie pliku wykonywalnego. Co nie zmienia faktu, że pytający jakby lepiej poszukał trafił by na mój gotowiec, a czytając opis funkcji FindWindow
chociażby na MSDNie, wiedzial że kombinuje bez sensu, bo tak się tego nie robi. Link do mojego krótkiego gotowca: http://4programmers.net/Delphi/Gotowce/Uchwyt_na_podstawie_nazwy_pliku_exe_programu a poza tym czy pytający widzi słowo Window? Ono nie jest w nazwie funkcji dla jaj, tylko coś sugeruje. Rozróżniasz Window, a Process? :P I podsumowując nie ma pewności czy takie pobranie uchwytu dla porcesu wpłynie na jego okno, bo można tworzyć okna dialogowe (wtedy bez nazwy klasy) i bez tytułu, ale na przykład mój kod z EnumWindows spowoduje, że można wpłynąc na okno przeglądarki WWW Opera - przez process opera.exe
i na przykład zamknąć jej okno.
Dzięki, ale kod h := ExeProcessToHWnd('notepad.exe');
ShowMessage(IntToStr(h));
SendMessage(h,WM_MOVE,100,100);
nie działa. Co źle robię?
Misiekd napisał(a)
NIE DZIAŁA to możesz powiedzieć jak Ci nie stanie przy dziewczynie.
Jak nie działa?
Nie kompiluje się, czy co?
chyba wybrales zla droge.
jesli chcesz po prostu przesunac okno w miejsce x,y uzyj SetWindowPos - wpisz w googlach zeby zobaczyc jak sie tego uzywa. poszukaj "SetWindowPos msdn" - a znajdziesz dokumentacje microsoftu.
Nie przesuwa okna, ale zwraca prawidłowy uchwyt do notatnika.
Co robisz źle? Bierzesz się za pewne za klikanie w VCL, a chyba powinieneś zacząc od pisania w konsoli, a później w czystym WinAPI. Odpowiedź jest oczywista. Programiści Microsoftu nie przewidzieli obsługi komunikatu WM_MOVE albo co bardziej prawdopodobne komunikat ten według MSDN'u jest wysyłany PO ruszeniu okna. Do zmian rozmiarów czy pozycji okien albo kontrolek służy inna funkcja API: SetWindowPos. Tylko wiesz to trzeba chwile pokombinowac, pogooglować i sam byś do tego doszedł. Wiadomo forum jest od naprowadzenia i pomocy, ale przeraża mnie to, że ludzie bardzo często nic, a nic samodzielnie nie szukają i nie kombinują. Coś nie działa to jeb od razu smarują posta na forum. I później muszą czekać, aż w pytaniach o banały w Delphi czy Pascalu ja im odpowiem, a przy okazji sobie trochę pomarudzę ;P
var
H : HWND;
begin
H := ExeProcessToHWnd('notepad.exe');
SetWindowPos(H, HWND_TOP, 10, 10, 0, 0, SWP_NOSIZE);
end;
EDIT: tyle marudziłem samrując tego posta, że cimak mnie ubiegł :) Ale ja za to pewnie ubiegne kolejne pytania w stylu Jak użyć SetWindowPos?
:>
dzięki, działa
Po MSDN potrafię się sam poruszać, ale niestety nie znam wszystkich funkcji WinAPI
No spoko, ja też nie, ale wpisanie w google set window position msdn
też by Ciebie naprowadziło. Anyway, temat leci do Newbie, bo to według mnie pytanie o podstawy raczej, może nie absolutne, ale nic super skomplikowanego.
A jest możliwe, że program blokuje komunikaty o zmianie rozmiarów i jest na nie odporny??