Как найти пункт меню (если таковые имеются), который открывает данный HMENU при активации?

если Вы хотите, чтобы 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
5
задан Martin B 27 August 2009 в 13:50
поделиться

1 ответ

Вы можете попробовать установить 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 в созданное меню, используя метод, описанный выше.

3
ответ дан 14 December 2019 в 19:20
поделиться