На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Диалог с вопросом в чужой программе
    Моя программа запускает стороннюю. Работают вместе. Когда возникает необходимость завершить работу, сторонней посылается сообщение:

    ExpandedWrap disabled
       
    HWND prog=::FindWindow(NULL,"Программа");
    if (prog)
    ::SendMessage(prog,WM_CLOSE, 0,0);
    ExpandedWrap disabled
       


    После чего, она спрашивает нужно ли сохранить изменения? Чтобы программно нажать на "Да", я делаю так:

    ExpandedWrap disabled
       
    HWND progQ=::FindWindow(prog,"Вопрос");
    If (progQ)
    ::PostMessage (progQ,WM_COMMAND,6,0);
    ExpandedWrap disabled
       


    -6 – это nCtrlID кнопки «Да».

    Но все замирает, комп ждет реакции на свой вопрос.
    Подскажите, что делать?
      Надо вместо SendMessage использовать Post_Message.
      Но кнопка не нажимается…
        Цитата TyT @
        Но кнопка не нажимается…

        WM_COMMAND для контролов всё-таки несколько не такой.
        WM_COMMAND
        Возможно, в этом проблема.
          Попробуй SendDlgItemMessage(progQ,6,BM_CLICK,0,0);

          PS: Согласно msdn, BM_CLICK может не сработать, если окно диалога не активно
            Сделал перебором. Кривовато, но работает.

            EnumChildWindows(progQ,EnumWindowsProc, 0);

            А в функции:
            ExpandedWrap disabled
               

            BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
            {
            char buff[256];
            int nCtrlID = ::GetDlgCtrlID(hwnd);

            if(hwnd){
            GetClassName(hwnd,(LPTSTR )buff,100);

            CString clN(buff);
            if (clN=="Button") {
            GetDlgItem(hwnd,nCtrlID);
            if (nCtrlID==6)
            ::PostMessage(hwnd,BM_CLICK,0,0);
            }
            }

            return TRUE;
            }
            ExpandedWrap disabled
               
              Цитата TyT @
              Сделал перебором. Кривовато, но работает.

              Попробуй окну диалога послать нормальный WM_COMMAND - ::PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDYES, BN_CLICKED), 0);

              А ещё лучше, возьми Spy++, выдели окно диалога, поставь фильтр, и посмотри какое сообщение приходит при нажатии на кнопку "Да". И отправь такое же.
                Цитата TyT @
                Сделал перебором. Кривовато, но работает.

                Проще сделать через FindWindowEx (либо одним вызовом с указанием класса окна и названия кнопки, либо перебором с контролем ID по GetDlgCtrlID)

                Цитата Олег М @
                Попробуй окну диалога послать нормальный WM_COMMAND - ::PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDYES, BN_CLICKED), 0);

                С учетом того, что IDYES=6, а BN_CLICKED=0, он так и делал в #1. Но у "нормального WM_COMMAND", еще и LPARAM д.б. равен не 0, а HWND кнопки

                Цитата Олег М @
                А ещё лучше, возьми Spy++, выдели окно диалога, поставь фильтр, и посмотри какое сообщение приходит при нажатии на кнопку "Да". И отправь такое же.

                BM_CLICK как раз и имитирует нажатие кнопки, посылая все необходимые сообщения
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0341 ]   [ 17 queries used ]   [ Generated: 28.03.24, 23:07 GMT ]