если Вы хотите, чтобы procdure скопировал поток в другой тот, что отправленная зарубка прекрасна, но это пропускает сброс положения, это должно быть
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
long TempPos = input.Position;
while (true)
{
int read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
input.Position = TempPos;// or you make Position = 0 to set it at the start
}
, но если это находится во времени выполнения не использование процедуры Вы, shpuld используют поток памяти
Stream output = new MemoryStream();
byte[] buffer = new byte[32768]; // or you specify the size you want of your buffer
long TempPos = input.Position;
while (true)
{
int read = input.Read (buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write (buffer, 0, read);
}
input.Position = TempPos;// or you make Position = 0 to set it at the start
Вы можете попробовать установить MENUINFO.dwMenuData
на дескриптор родительского меню для всех меню, которые вы создаете в своем приложении:
MENUINFO mi;
mi.cbSize = sizeof(MENUINFO);
mi.dwMenuData = (ULONG_PTR)<parent HMENU if this is a sub menu>
mi.fMask = MIM_MENUDATA;
SetMenuInfo(hCreatedMenu, &mi);
Тогда вам нужно только запросить это Поле dwMenuData
в вашей функции:
bool getParentMenuItem(HMENU mnu, HMENU *parentMenu, int *parentMenuIdx)
{
MENUINFO mi;
mi.cbSize = sizeof(MENUINFO);
mi.fMask = MIM_MENUDATA;
if (!GetMenuInfo(mnu,&mi) || mi.dwMenuData == 0)
return false;
*parentMenu = (HMENU)mi.dwMenuData;
// not sure how or why you need the parentMenuIdx, but you should be able
// to derive that from the parent HMENU
return true;
}
Изменить: Если у вас нет контроля над тем, как создаются все меню, вы можете использовать ловушку WH_CALLWNDPROC
для перехвата при первом открытии меню создан. Хорошая статья (с исходным кодом) описывает, как это можно сделать - затем вы можете посмотреть на попытку внедрения родительского HMENU в созданное меню, используя метод, описанный выше.