«Что умеет MsgBox» или «А вы в курсе, что...»

Модератор: Хакер

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

«Что умеет MsgBox» или «А вы в курсе, что...»

Сообщение Хакер » 05.04.2009 (Вс) 21:32

А вы в курсе (я, вплоть до текущего момент — нет), что контент MsgBox-а можно копировать в буфер обмена простым нажатием Ctrl+C во время показа окна с сообщением?

Никогда не слышал о такой возможности, не предполагал о её существовании, но, ковыряясь в кишках винды, нашёл интересную функцию:
Код: Выделить всё
/***************************************************************************\
* MB_CopyToClipboard
*
* Called in response to WM_COPY, it will save the title, message and button's
* texts to the clipboard in CF_UNICODETEXT format.
*
*   ---------------------------
*   Caption
*   ---------------------------
*   Text
*   ---------------------------
*   Button1   ...   ButtonN
*   ---------------------------
*
*
* History:
* 08-03-97 MCostea      Created
\***************************************************************************/

void MB_CopyToClipboard(
    HWND hwndDlg)
{
    LPCWSTR lpszRead;
    LPWSTR  lpszAll, lpszWrite;
    HANDLE  hData;
    static  WCHAR   szLine[] = L"---------------------------\r\n";
    UINT    cBufSize, i, cWrote;
    LPMSGBOXDATA lpmb;

    if (!(lpmb = (LPMSGBOXDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA)))
        return;

    if (!OpenClipboard(hwndDlg))
        return;

    /*
     * Calculate the buffer size:
     *      - the message text can be all \n, that will become \r\n
     *      - there are a few extra \r\n (that's why 8)
     */
    cBufSize =  (lpmb->lpszCaption ? wcslen(lpmb->lpszCaption) : 0) +
                (lpmb->lpszText ? 2*wcslen(lpmb->lpszText) : 0) +
                4*sizeof(szLine) +
                lpmb->cButtons * gpsi->wMaxBtnSize +
                8;

    cBufSize *= sizeof(WCHAR);

    if (!(hData = UserGlobalAlloc(LHND, (LONG)(cBufSize))) ) {
        goto CloseClip;
    }

    USERGLOBALLOCK(hData, lpszAll);
    UserAssert(lpszAll);

    cWrote = wsprintf(lpszAll, L"%s%s\r\n%s",
                                szLine,
                                lpmb->lpszCaption ? lpmb->lpszCaption : L"",
                                szLine);

    lpszWrite = lpszAll + cWrote;
    lpszRead = lpmb->lpszText;
    /*
     * Change \n to \r\n in the text
     */
    for (i = 0; *lpszRead; i++) {

        if (*lpszRead == L'\n')
            *lpszWrite++ = L'\r';

        *lpszWrite++ = *lpszRead++;
    }

    cWrote = wsprintf(lpszWrite, L"\r\n%s", szLine);
    lpszWrite += cWrote;

    /*
     * Remove & from the button texts
     */
    for (i = 0; i<lpmb->cButtons; i++) {

        lpszRead = lpmb->ppszButtonText[i];
        while (*lpszRead) {
            if (*lpszRead != L'&') {
                *lpszWrite++ = *lpszRead;
            }
            lpszRead++;
        }
        *lpszWrite++ = L' ';
        *lpszWrite++ = L' ';
        *lpszWrite++ = L' ';
    }
    wsprintf(lpszWrite, L"\r\n%s\0", szLine);

    USERGLOBALUNLOCK(hData);

    NtUserEmptyClipboard();
    /*
     * If we just called EmptyClipboard in the context of a 16 bit
     * app then we also have to tell WOW to nix its 16 handle copy of
     * clipboard data.  WOW does its own clipboard caching because
     * some 16 bit apps use clipboard data even after the clipboard
     * has been emptied.  See the note in the server code.
     *
     * Note: this is another place (besides client\editec.c) where
     * EmptyClipboard is called* for a 16 bit app not going through WOW.
     * If we added others we might want to move this into EmptyClipboard
     * and have two versions.
     */
    if (GetClientInfo()->CI_flags & CI_16BIT) {
        pfnWowEmptyClipBoard();
    }

    SetClipboardData(CF_UNICODETEXT, hData);

CloseClip:
    NtUserCloseClipboard();

}
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: «Что умеет MsgBox» или «А вы в курсе, что...»

Сообщение iGrok » 05.04.2009 (Вс) 22:23

Офигеть...

Это значит, что теперь можно не просить "перепиши сообщение, которое там появляется", а просто сказать, чтобы юзер нажал Ctrl-C. А ведь логично. И удобно. И вообще.

Побежал юзать.
label:
cli
jmp label

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: «Что умеет MsgBox» или «А вы в курсе, что...»

Сообщение ANDLL » 05.04.2009 (Вс) 23:00

Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Re: «Что умеет MsgBox» или «А вы в курсе, что...»

Сообщение dormouse » 06.04.2009 (Пн) 7:58

а я знаю эту фичу уже месяца три.. :P
VBA, MSA97

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: «Что умеет MsgBox» или «А вы в курсе, что...»

Сообщение VVitafresh » 30.04.2009 (Чт) 16:12


Да, я помню тот топик, с тех пор частенько юзаю эту возможность. Жаль, в некоторых программах не работает, по-видимому в них разработчики делают свои кастомные месседжбоксы.

P.S. Я тогда хоть и не был зарегистрирован на форуме, но частенько почитывал.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Re: «Что умеет MsgBox» или «А вы в курсе, что...»

Сообщение Saturn.65 » 19.06.2009 (Пт) 22:32

И в правду. Спасибо. Будем знать. :)
Главное, ребята, сердцем не стареть...


Вернуться в Мой блог

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList