Witam
Normalnie pisze w javie. Chcę sobie zaimplementować przyklejające się okienko do brzegu ekranu ( nie nie dokowanie do brzegu) czyli np. jeżeli użytkownik zbliży okienko (przesuwając je ) do lewej krawędzi, wtedy ustawiamy jego pozycje na (0,y).
Robię to w dll (musi to być dll dla javy) i mam takie oto hooki oraz obsugę:
Dodam jeszcze, że dll generalnie działa, bo wypisuje mi położenie okna przy przemieszczaniu oraz sygnalizuje, że spełniony jest warunek "przyklejenia". Niestety okienko nie zmienia pozycji (wg dokumentacji powinno w przynajmniej jego ramka - i tutaj może leży problem). Jak zastosowałem to co jest zakomentowane (ten setWindow position) to już coś się tam działo, ale szału nie ma bo strasznie migało.
Hook:
JNIEXPORT void JNICALL Java_javax_pl_choina_StickyJFrame_makeWindowSticky
(JNIEnv *env, jobject obj, jint intval)
{
stickyWindowHandle=getHWND();
stickyWindowHook= SetWindowsHookEx(
WH_CALLWNDPROC,
windowMovedOnScreen,
getCurrentModule(),
0);
if(stickyWindowHook==NULL)
std::cout<<"Error during creating window hook CODE:"+GetLastError()<<"\n";
else
std::cout<<"Window hook successfuly created\n";
stickyOffset=intval;
}
Callback:
LRESULT CALLBACK windowMovedOnScreen(int nCode, WPARAM wParam, LPARAM lParam )
{
if(nCode<0)
return CallNextHookEx(NULL,nCode,wParam,lParam);
if(nCode==HC_ACTION)
{
CWPSTRUCT* msg=(CWPSTRUCT*)lParam;
if(msg->message==WM_MOVING)
{
RECT* rect=(RECT*)(msg->lParam);
std::cout<<"Pozycja okna z JNI to: "<<rect->left<<":"<<rect->top<<"\n";
// stick to left edge
if(rect->left-stickyOffset<0)
{
((RECT*)(msg->lParam))->left=0;
std::cout<<"Niby ustawiam ale i tak nic z tego;/;/\n";
//SetWindowPos(stickyWindowHandle,0,0,0,0,0,SWP_NOZORDER | SWP_NOSIZE);
return true; // tutaj próbowałem również false ale mało pomogło ;/
}
}
}
// std::cout<<"Kod wiadomosci: "<<nCode<<"\n";
return CallNextHookEx(NULL,nCode,wParam,lParam);
}