Podmiana komunikatu... message, WM_MOVING,Rect

0

witajcie.
mam taka procedurke uzywana jako globalny hook:

function MSGProc(nCode, wParam: Integer; lParam: PCWPSTRUCT): Integer; stdcall;
var R:PRect;
begin

if Assigned(lParam) and (lParam^.message = WM_MOVING) then
     begin
     R:=Pointer(lParam^.lParam);
     end;

Result:=CallNextHookEx(HookHandle, nCode, wParam, Integer(lParam));
end;

i teraz mam problem:
nie ma problemu, zeby odczytac pozycje okna podczas przesuwania...
ale jak ja zmienic?
myslalem, ze

R.Left:=10;

zalatwi sprawe, ale to nie dziala...

jak to zmienic?

dzieki
pozdro

0

jak dobrze pamietam to jest coś takiego jak setWindowPos(HWND;Tpoint);

0

niezupelnie... SetWindowPos() zadzialalo by tylko wtedy, gdybys mial wlaczone w systemie "Pokaz zawartosc okna podczas przeciagania".
Jesli ta opcja jest wylaczona, to podczas przeciagania okna pojawia sie ramka a okno zostaje w tym samym miejscu - dopiero po zakonczeniu przeciagania zostaje przesuniete.

0

Heh, pozwole sobie wrocic do mojego pytania sprzed trzech lat;]
bo rozwiazania nie znalazlem a ostatnio mnie naszlo, ze moze jednak uda mi sie cos z tym zrobic...

moze tym razem znajdzie sie ktos kto bedzie znal odpowiedz dlaczego to cholersto nie chce dzialac?
moze jakies inne alternatywne rozwiazanie zamiast hooka?

0

Miałem podobny problem tylko że w c#, tak to rozwiązałem (może pomoże, choć wiem że już trochę lat minęło, najwyżej przyda się komuś innemu):

        const int M_MOVING = 0x0216;
        protected override unsafe void WndProc(ref Message m) {

            switch (m.Msg) {

                case M_MOVING: 
                RECT * p;                            
                p = (RECT *)m.LParam.ToPointer();
                
                RECT poz = new RECT();
                poz = *p;
                
                poz.left = 432;
                *p = poz;                      //ustawiam wartość tego wskaźnika z LParm przypisując mu całkiem nową strukturę, którą wcześniej tworze i modyfikuje jej pola
                
                break;
            }

            


</cpp>
0

2 Lata minęły, ja szukam rozwiązania i przypadkowo tutaj trafiłem. To co Ty tutaj robisz normalni ludzie nazywają wyciekiem pamięci. To co masz w komentarzu nie jest prawdą, nie przypisujesz nowej struktury tylko modyfikujesz istniejącą zobacz sam.

  1. Tworzysz wskaźnik na recta z lParam (p)
  2. Tworzysz obiekt RECT pod zmienną poz
  3. poz = * p - WSTAWIASZ POD ZMIENNĄ poz TO CO SIEDZIAŁO POD WSKAŹNIKIEM - tracisz nowo tworzoną strukturę - wyciek pamięci
  4. modyfikujesz to co bytło w lParamie
  5. przypisujesz wartość samą do siebie (poz było obiektem na który p wskazywał)
    więc kod bez sensu, ale wierze, że działa - bo według dokumentacji działać powinien - niestety u mnie jest taki problem, że to nie chce mi ustawić okna na nowej pozycji niestety.
    Pozdro!
    Lece szukać dalej.
0

SIema,

ten c#owy kodzik ma sens, ale ja moge zaproponowac cos innego co kieeeedys zastosowalem:

kod w delphi:

 var
  wp : TWindowPlacement;
begin
  wp.length := SizeOf(wp);
  GetWindowPlacement(Handle, @wp);
  wp.showCmd := SW_NORMAL;
  wp.rcNormalPosition.TopLeft := Point(100,100);
  SetWindowPlacement(Handle, @wp);

SetWindowPlacement <--- poczytac :)

pozdro

0

przykladowe okienko z ladnym przyklejaniem (src incl)
http://www.speedyshare.com/SpPDj/Project1.exe

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