Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2017, 11:32   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Обновление чужого окна

Здравствуйте. Есть программа периодически должна обновить таблицу в другом приложении. Если приложение свернуто то необходимо его развернуть и нажать на нем F5. Но на практике код как то странно работает.
Чужое окно открывается, сообщение ему посылается, но окно после таких манипуляций становится каким то ограниченно активным. То есть по кнопке свернуть его уже не получается свернуть. Для возвращения нормального состояния нужно мышью щелкнуть по иконке на панели задач два раза. Только тогда оно начинает нормально функционировать.

Может ктонибудь знает в чем может быть проблема? Может я как то криво команды подаю окну?

Вот код на C# оболочка для функций API:

Код:
 public static bool UpdateTerminalTable()
        {
            bool result = false;
            IntPtr ShellWnd = FindWindow("TMainForm", null);
            if (ShellWnd != null && ShellWnd != IntPtr.Zero)
            {
                ShowWindow(ShellWnd, ShowCmd.SW_SHOWNORMAL);                
                Application.DoEvents();                
                SetActiveWindow(ShellWnd);
                Application.DoEvents();
                SetForegroundWindow(ShellWnd);
                Application.DoEvents();
                ClickF5(ShellWnd);

                List<IntPtr> test = GetChildWindows(ShellWnd);
                StringBuilder headerName = new StringBuilder(256);
                StringBuilder className = new StringBuilder(256);
                for (int i = 0; i < test.Count; i++)
                {
                    // TPositionsForm
                    GetClassName(test[i], className, 255);
                    if (className.ToString() == "TPositionsForm")
                    {
                        ClickF5(test[i]);
                        result = true;
                    }
                }
            }
            return result;
        }

        private static void ClickF5(IntPtr target)
        {
            uint WM_KEYDOWN = 0x0100;
            uint WM_KEYUP = 0x0101;
            uint VK_F5 = 0x74;
            PostMessage(target, WM_KEYDOWN, VK_F5, 0);
            Thread.Sleep(100);
            PostMessage(target, WM_KEYUP, VK_F5, 0);

            // С этим результат такойже
            //SendMessage(target, WM_KEYDOWN, VK_F5, 0);
            //Thread.Sleep(100);
            //SendMessage(target, WM_KEYUP, VK_F5, 0);

        }
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 06.04.2017 в 11:56.
WorldMaster вне форума Ответить с цитированием
Старый 06.04.2017, 12:12   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Попробуйте передать окну фокус.
SetFocus()
waleri вне форума Ответить с цитированием
Старый 06.04.2017, 12:29   #3
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Чужое окно открывается, сообщение ему посылается, но окно после таких манипуляций становится каким то ограниченно активным. То есть по кнопке свернуть его уже не получается свернуть.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  H: HWND;
begin
  H := FindWindow('TMainForm', nil);
  if H <> 0 then
  begin
    H := GetWindow(H, GW_OWNER);
    if (H <> 0) and IsIconic(H) then
      ShowWindow(H, SW_RESTORE);
  end;
end;
Filka вне форума Ответить с цитированием
Старый 06.04.2017, 16:09   #4
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

WorldMaster, как успехи?
Filka вне форума Ответить с цитированием
Старый 06.04.2017, 17:20   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
WorldMaster, как успехи?
Да отлично .. теперь вроде как положено всплывает. И мышкой сразу дает управлять. Но теперь TPositionsForm перестал внутри находить.
Хотя тут вообще неоднозначно. Основное окно это MDI контейнер. может достаточно ему передавать F5 чтобы оно обновило таблицы.


Спасибо.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 06.04.2017, 17:29   #6
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Код:
procedure Restore(Wnd: HWND);
var
  H: HWND;
begin
  H := GetWindow(Wnd, GW_OWNER);
  if (H <> 0) and IsIconic(H) then
    ShowWindow(H, SW_RESTORE);
  //SetActiveWindow(Wnd);
  SetForegroundWindow(Wnd);
end;

procedure ClickF5(Wnd: HWND);
begin
  PostMessage(Wnd, WM_KEYDOWN, VK_F5, 0);
  Sleep(100);
  PostMessage(Wnd, WM_KEYUP, VK_F5, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  H: HWND;
begin
  H := FindWindow('TMainForm', nil);
  if H <> 0 then
  begin
    Restore(H);
    ClickF5(H);
    //List<IntPtr> test = GetChildWindows(H);
    // и т. д.
  end;
end;
?
Filka вне форума Ответить с цитированием
Старый 06.04.2017, 17:37   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Filka Посмотреть сообщение
Код:
procedure Restore(Wnd: HWND);
var
  H: HWND;
begin
  H := GetWindow(Wnd, GW_OWNER);
  if (H <> 0) and IsIconic(H) then
    ShowWindow(H, SW_RESTORE);
  //SetActiveWindow(Wnd);
  SetForegroundWindow(Wnd);
end;

procedure ClickF5(Wnd: HWND);
begin
  PostMessage(Wnd, WM_KEYDOWN, VK_F5, 0);
  Sleep(100);
  PostMessage(Wnd, WM_KEYUP, VK_F5, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  H: HWND;
begin
  H := FindWindow('TMainForm', nil);
  if H <> 0 then
  begin
    Restore(H);
    ClickF5(H);
    //List<IntPtr> test = GetChildWindows(H);
    // и т. д.
  end;
end;
?

Нуда .. логика такая же .. завтра еще поковыряюсь.
Спасибо.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 06.04.2017, 17:43   #8
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Пожалуйста.
Filka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение размеров чужого окна s77lanselot77s C# (си шарп) 7 30.06.2012 11:40
Заменить содержимое чужого окна jhonyxakep Win Api 1 10.05.2011 01:45
Сворачивание чужого окна artemavd Общие вопросы Delphi 2 27.04.2010 07:45
VirtualStringTree чужого окна akaTemporary Общие вопросы Delphi 0 29.01.2010 14:32
delphi прозрачность чужого окна guffer Общие вопросы Delphi 1 26.11.2009 22:20