Блокировка контекстного меню

  • Автор темы Bloodius Baggins
  • Дата начала
B

Bloodius Baggins

#1
Здравствуйте :)

Такая проблема возникла. Юзаю CodeSence Control (OCX версию, других нет) в проекте на VB.NET (то есть раньше проект был на VB6, но теперь есть необходимость переписать под VB.NET). Так вот, в этот контрол вшито контекстное меню (будь оно проклято), которое появляется каждый раз по клику правой кнопокой мыши на контроле.
В VB6 я избавлялсо от этого api-функцией LockWindowUpdate, которая под дотНетом не помогает.
Вопреки заверениям личностей, которые "давно когда-то работали" с этим контролом и его прародителем CodeMax, никакого свойства, отвечающего за отображение/неотображение этого меню, там нету.
Установка свойства ContextMenu, которое добавляет (?) дотНет к контролам, наследующим TextBox (опять-таки ?), не спасает, все равно вылазит родное меню.
Может быть, кто-то знает, как заблокировать эту гадость и отображать по RClick'y свое меню, какое мне надо? Буду очень признателен за помощь.
 
E

eisernWolf

#2
Ну а что если фильтровать сообщения Windows, которые посылаются в окно OCX контрола, и WM_RBUTTONDOWN забирать себе?
 
B

Bloodius Baggins

#3
Наверное, должно бы сработать, но только как это реализовать?
 
K

karlito

#4
Код:
		/// <summary>
/// Processes Windows messages.
/// </summary>
/// <param name="m">The Windows <see cref="Message"/> to process.</param>
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode=true)]
protected override void WndProc(ref Message m)
{
if(m.Msg == Interop.OCM_NOTIFY)
{
NMHDR phdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
switch(phdr.code)
{
case (int)LVN.GETDISPINFOW:
{
NMLVDISPINFO pinfo = (NMLVDISPINFO)Marshal.PtrToStructure(m.LParam, typeof(NMLVDISPINFO));
LvnDispInfoNotice(ref pinfo);
break;
}
case (int)LVN.ODCACHEHINT:
{
NMLVCACHEHINT cachehint = (NMLVCACHEHINT)Marshal.PtrToStructure(m.LParam, typeof(NMLVCACHEHINT));
LvnCacheHint(cachehint);
break;
}
case (int)LVN.ODFINDITEMW:
{
NMLVFINDITEM lvfindItem = (NMLVFINDITEM)Marshal.PtrToStructure(m.LParam, typeof(NMLVFINDITEM));
m.Result=(IntPtr)LvnFindItem(lvfindItem);
return;
}
}
}
else
if(m.Msg == (int)LVM.GETITEMW)
{
LVITEM lvitem = (LVITEM)Marshal.PtrToStructure(m.LParam, typeof(LVITEM));
if(LvmGetItem(ref lvitem))
Marshal.StructureToPtr(lvitem, m.LParam, true);
return;
}

base.WndProc(ref m);

if(m.Msg == (int)LVM.INSERTITEMW)
{
LVITEM lvitem = (LVITEM)Marshal.PtrToStructure(m.LParam, typeof(LVITEM));
AfterLvmInsertItem(lvitem, ((int)m.Result));
return; //no need to let any one to insert items in VIRTUAL LV in a such a way
}
}
Выдрал кусок кода из custom virtual list view, который когда-то разрабатывал.
 
B

Bloodius Baggins

#5
Спасибо. Осталось только разобраться, как это дело под VB.NET переписать :)