关于找窗口这个,之前有写过类似的,这里就大概提一下下,首先是EnumWindows和EnumChildWindows,前者只是会遍历顶层的窗口,所以需要找其他窗口时可以结合后者额使用,具体使用就看函数说明了.. 很简单的了。而GetClassName这个函数可以通过句柄拿到窗口类,比较的话可以通过比如ms的工具好像叫spy++之类的去看窗口的类名或者其他很多方式去获取了,然后字串对比就行了。GetWindowThreadProcessId这个就是后续可能需要进程线程了。
下面就说下吸附喽~ 简单的实现就大概是通过一个计时器,然后定时触发,根据某个窗口的位置绘制想要吸附的窗口。其实原理就这么简单而已。计时器触发的函数就类似于:myWinPos在里面我是用来决定吸附在目标的左或右位置的一个标记。
void updateWinDisplay()
{
if(myWnd==NULL){
refreshTimer->stop();
return;
}
HWND parentHandle = myWnd;
while(GetParent(parentHandle)!=NULL)
parentHandle = GetParent(parentHandle);
//寻找父窗口
if(!GetWindowRect(parentHandle,&WinRect)){
refreshTimer->stop();
return;
}
//更改大小和位置
long WinH = WinRect.bottom - WinRect.top;
int leftPos;
if(false == myWinPos)
leftPos = WinRect.left-this->frameGeometry().width();
else
leftPos = WinRect.right;
int reduce = frameGeometry().height()-this->height();
this->resize(this->width(),WinH-reduce);
this->setMinimumHeight(WinH-reduce);
this->setMaximumHeight(WinH-reduce);
this->move(leftPos,WinRect.top);
}
我这里是实现在鼠标点击拖动的时候会停止计时,然后释放时重新去判断放置的位置。
bool BattleAssUI::eventFilter(QObject* obj, QEvent* event)
{
// qDebug()<<"eventFilter";
if(obj== this)
{
// qDebug()<<"eventFilter:this";
if(event->type() == QEvent::NonClientAreaMouseButtonPress)
{
mousePress = true;
refreshTimer->stop();
qDebug()<<"MouseButtonPress"<<mousePress;
}
else if((event->type() == QEvent::NonClientAreaMouseButtonRelease) && mousePress)
{
if(((QMouseEvent*)event)->globalX()>WinRect.right)
myWinPos = true;
else
myWinPos = false;
refreshTimer->start();
mousePress= false;
qDebug()<<"MouseButtonRelease"<<mousePress;
}
else if((event->type() == QEvent::Resize) && mousePress)
{
// QSize tempSize = const_cast<QSize&>( ((QResizeEvent*)event)->size() );
const_cast<QSize&>( ((QResizeEvent*)event)->size() ).setHeight(((QResizeEvent*)event)->oldSize().height());
// this->resize(((QResizeEvent*)event)->size().width(),((QResizeEvent*)event)->oldSize().height());
refreshTimer->start();
mousePress= false;
event->setAccepted(true);
qDebug()<<"QResizeEvent"<<mousePress;
}
}
return QObject::eventFilter(obj, event);
}
很简单就是这样了,当然这里面其实还不是完善的,这就要靠大家改了。