Пример хука. Надеюсь, что он тебе поможет:
BOOL FilterInstalled = FALSE;
BOOL DoubleClickFilter(MSG *pMsg)
{
BOOL MyBlock = FALSE;
// Обрабатываем только если DBLCLK и это окно DwgView
if (pMsg->message == WM_LBUTTONDBLCLK && acedGetAcadDwgView()->GetSafeHwnd() == pMsg->hwnd) {
acedDwgPoint dcsPt,ucsPt; CPoint winPt(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
// Преобразуем координаты курсора в DCS
acedCoordFromPixelToWorld(winPt, dcsPt);
struct resbuf dcs, ucs;
dcs.restype = RTSHORT; dcs.resval.rint = 2; // DCS
ucs.restype = RTSHORT; ucs.resval.rint = 1; // UCS
// Преобразуем координаты курсора в UCS для acedSSGet
acedTrans(dcsPt, &dcs, &ucs, FALSE, ucsPt);
ads_name ss,en;
// Находим примитив под курсором:
if (acedSSGet(":E", ucsPt, NULL, NULL, ss) == RTNORM) {
// Нужно обязательно включить блокировку!!!
if (acDocManager->lockDocument(curDoc()) == Acad::eOk) {
AcDbObjectId eid; acedSSName(ss,0,en);
if (acdbGetObjectId(eid,en) == Acad::eOk) {
AcDbObjectPointer<AcDbBlockReference> pBlk(eid,AcDb::kForRead);
if (pBlk.openStatus() == Acad::eOk) {
AcDbObjectPointer<AcDbBlockTableRecord> pBtr(pBlk->blockTableRecord(),AcDb::kForRead);
if (pBtr.openStatus() == Acad::eOk) {
char *pName = NULL;
if (pBtr->getName(pName) == Acad::eOk) {
// Если указан блок и его имя "Myblock" - обработаем его
// Если нет - пусть с ним мучается AutoCAD
if (!stricmp(pName,"MyBlock")) {
pBtr->close();
acedAlert("Это наш блок - попробуем его редактировать.");
// Снимаем ручки
acedSSSetFirst(NULL,NULL);
// Увеличим масштаб блока в 1.2 раза
AcGeScale3d sc = pBlk->scaleFactors();
sc.setToProduct(sc,1.2);
Acad::ErrorStatus es;
if ((es = pBlk->upgradeOpen()) == Acad::eOk) {
pBlk->setScaleFactors(sc);
pBlk->downgradeOpen();
} else {
char buf[256];
sprintf(buf,"Ошибка при попытке открыть блок на запись: %s",acadErrorStatusText(es));
acedAlert(buf);
}
// Сообщаем AutoCAD, что ему уже не нужно
// обрабатывать DBLCLK
MyBlock = TRUE;
}
free(pName);
}
}
}
acDocManager->unlockDocument(curDoc());
}
}
}
}
return MyBlock;
}
В InitApp:
FilterInstalled = acedRegisterFilterWinMsg(DoubleClickFilter);
В UnloadApp:
if (FilterInstalled) {
acedRemoveFilterWinMsg(DoubleClickFilter);
}