Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978

Сложности при вызове программы

26.02.2018, 14:59. Показов 1627. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В связке участвуют 2 программы (обе - мои) Одна на WinApi, другая на Qt. В какой из них возможно решение проблемы, я не знаю. Чтобы не дублировать темы (что запрещено) даю ссылку на ее первую публикацию.
Сложности на стыке
Может быть кто-то из специалистов по WinApi подскажет решение...
С Надеждой, которая умирает последней...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2018, 14:59
Ответы с готовыми решениями:

Сложности при вызове контекстного меню в Windows
Здравствуйте. Столкнулся со следующей проблемой: при нажатии на правую кнопку мыши по какому-либо значку выполняется Windows Installer,...

Как из программы добавить переменные при вызове внешней программы через system?
В разрабатываемой программе имеются готовые переменные path и аргумент argv возвращающий название файла. Я хочу вызвать на исполнение...

Возникли сложности при написании программы
Задача: Дана двумерная квадратная матрица. Получить массив b1 …bn , где bi - это сумма элементов, расположенных за первым отрицательным...

25
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
26.02.2018, 15:45
Цитата Сообщение от Байт Посмотреть сообщение
Когда в Q я выделяю текст и копирую (Ctrl-Ins), выделенный текст оказывается на сером фоне (вместо синего) и ... пропадает курсор. Ввод блокируется.
Т.е. EDIT теряет фокус ввода? Выделите текст и, не нажимая Ctrl-Ins, ткните мышью в какой-нибудь другой контрол или нажмите TAB, происходит ли тоже самое, что вы описываете "текст становится серым и пропадает курсор"?
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
26.02.2018, 16:07  [ТС]
Ygg, Других контролов нету. Чистый QTextEdit (с заголовком окна(title))
Зато есть меню по правой мышке. Так вот, при появлении меню текст сереет (что, видимо, естественно), но после Esc остается серым и курсор пропадает. Но не всегда. Четкой закономерности я еще не выяснил.
При этом временами и щелчок мышкой не восстанавливает курсора.
Цитата Сообщение от Ygg Посмотреть сообщение
EDIT теряет фокус ввода?
Скорее всего так. И уж я ставил setFocus, где только мог.
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
26.02.2018, 16:26
А если временно убрать вызов EnumWindows из виндовой части, то фокус так же теряется?
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
26.02.2018, 16:41  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
А если временно убрать вызов EnumWindows из виндовой части,
Убирал. Заменял его на SetActiveWindow. Эффект чудовищный. При любом щелчке на W-окне последнее выходит на передний план и загораживает Q-окно. Приходится вытаскивать его из трея, чего пользователю, конечно, не понять...
....
Простите, неправильно понял вопрос. Я подумал, что вы говорите о SetForegroundWindow...
А как я тогда выведу Q- окно на передний план?
Ладно, сейчас попробую...

Добавлено через 6 минут
Убрал EnumWindows. Эффект ожидаемый. W-окно загораживает Q-окно. Ведь SetForegroundWindow не происходит...
Для того-то и перебор окон, чтоб выдвинуть на передний план
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
26.02.2018, 16:51
А ручками оно разве не вытаскивается на передний план? Данным тестом хотелось понять, есть ли какая-либо зависимость потери фокуса внутри QT от вызовов SetActiveWindow и SetForegroundWindow из виндовой части или нет.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
26.02.2018, 17:22  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
А ручками оно разве не вытаскивается на передний план?
Ручками, это как? Щелчком на значке в трее? Вытаскивается.
Чушь вся в том, что это уродство возникает только при первом Ctrl-Ins. Или при первом "Копировать" из выпадающего меню. А потом все происходит нормально. Причем, это не зависит от того, сколько времени прошло. Я могу даже ввести чего-нибудь...
Из меню я вызываю просто метод QTextEdit-а copy()
Может быть мне его переопределить? По первому обращению продублировать?

Добавлено через 10 минут
Вот еще интересный момент. На первом Shift-Ins (вставить) - оно вставляется, но курсорчик пропадает. Что-то не ладит моя программулька с Клипбордом...
Но при запуске в автономе (без windows-части) все совершенно замечательно!

Добавлено через 4 минуты
Может быть можно как-то запретить всю реакцию на мышь в виндоус-части.. Но это у меня не получилось... Как я понял, за щелчками мыши послеживает сама Операционная Система. Хотя бы для переключения между окнами...
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
26.02.2018, 19:09
Затрудняюсь сказать что-либо за QT часть.
В плане винды...
наверное, флаги при создании процесса можно опустить, толку от них не много,
вроде, SetActiveWindow не работает с чужими окнами, лучше ShowWindow(hWnd, SW_SHOW),
можно поменьше насиловать QT сообщениями, сделать сперва проверку состояния окна, если проверка не прошла, то только тогда отправлять сообщение
C++
1
2
if (GetForegroundWindow() != hWnd)
   SetForegroundWindow(hWnd);
Добавлено через 1 час 45 минут
Похоже, что это проблема QT. Если сделать простое приложение из единственного виджета (QTextEdit), то оно даже самостоятельно точно так же теряет фокус (или что-то ещё) после вызова контекстного меню. Нужно делать отдельный виджет и встраивать в него QTextEdit, тогда всё работает, вроде бы.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <QGridLayout>
#include <QWidget>
#include <QTextEdit>
 
//mywidget.h
class MyWidget : public QWidget
{
    Q_OBJECT
 
public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();
};
 
//mywidget.cpp
MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *la = new QGridLayout(this);
    la->setMargin(0);
 
    QTextEdit *te = new QTextEdit(this);
 
    la->addWidget(te);
}
 
MyWidget::~MyWidget()
{
 
}
 
// main
#include "mywidget.h"
#include <QApplication>
#include <QTextEdit>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    MyWidget w;
    w.show();
 
    return a.exec();
}
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
26.02.2018, 21:47  [ТС]
Ygg, Спасибо. Вот уже есть что-новенькое, чего я не пробывал. Отдышусь - попробую.
Цитата Сообщение от Ygg Посмотреть сообщение
Если сделать простое приложение из единственного виджета (QTextEdit), то оно даже самостоятельно точно так же теряет фокус (или что-то ещё) после вызова контекстного меню.
За это отдельное спасибо. Вы меня избавили от постановки экспериментов, к которым я уже собрался было приступить. Однако, странно. Как будто в автономе-то все было хорошо. Впрочем, мог я запутаться.

Добавлено через 2 часа 4 минуты
Цитата Сообщение от Ygg Посмотреть сообщение
оно даже самостоятельно точно так же теряет фокус (или что-то ещё) после вызова контекстного меню
А вы правы! С меню и правда ерунда всякая получается. в автономе - тоже. Ладно, укутаем в лайоты, может и пробьемся...

Добавлено через 16 секунд
Цитата Сообщение от Ygg Посмотреть сообщение
оно даже самостоятельно точно так же теряет фокус (или что-то ещё) после вызова контекстного меню
А вы правы! С меню и правда ерунда всякая получается. в автономе - тоже. Ладно, укутаем в лайоты, может и пробьемся...
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,927
27.02.2018, 11:54
Цитата Сообщение от Байт Посмотреть сообщение
Четкой закономерности я еще не выяснил.
Цитата Сообщение от Байт Посмотреть сообщение
возникает только при первом Ctrl-Ins
Не знаю ни WinAPI, ни QT, но такие симптомы похожи на неправильную или отсутствующую инициализацию чего-то
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.02.2018, 14:52  [ТС]
Чудеса продолжаются. Сделал в Винд-части
C
1
2
3
     if (::GetForegroundWindow() != (HWND)hwnd)
       ::SetForegroundWindow((HWND)hwnd);  
     ::ShowWindow((HWND)hwnd, SW_SHOW);  // Если это убрать - чудеса пропадают. Можно переставить - не влияет...
После Ctrl-Ins возникает пустое прозрачное окно. Явно имеющее отношение в Qt-части
Чует мое сердце, что что-то там не то с QTextEdit...
Копаю дальше... Замечание COKPOWEHEU буду иметь в виду
Буду оборачивать QTextEdit лайоутом ...
Конечно, не исключаю какой-то дурацкой плюхи совсем в другом месте...

Добавлено через 2 часа 25 минут
Цитата Сообщение от Байт Посмотреть сообщение
Буду оборачивать QTextEdit лайоутом ...
Обернул. В диалог. Контекстное меню работает, вроде, нормально. А автономе тоже все хорошо.
Но в связке именно первый Ctrl-Ins (как и "копировать" из Поп-меню) заставляет терять фокус.
Ygg, в вашем Qt-коде в посте 8 после w.show() надо поставить te->setFocus() (ну, не совсем так, но понятно, надо передать фокус ТекстЕдиту) Иначе при его появлении курсора нет.
На всякий случай поставил самую строгую полицию фокуса
C++ (Qt)
1
te->setFocusPolicy(Qt::WheelFocus);
Но это ничего не изменило, она, видимо, и так была
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
27.02.2018, 15:59
Байт, запускал у себя на 10 винде тот код, что привёл. И отдельно и с вызовом из другого приложения по вашему образцу. Никаких проблем не увидел. При копировании горячими клавишами ничего не теряется. При копировании через меню то же ничего не теряется. Возможно, вы что-то добавили в код, что приводит к такому поведению. QT 5.6, VS 2015.
Архив с проектами и скомпилированными файлами. Для запуска test.exe в bin нужно докинуть QT-библиотеки: Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll и каталог platforms. Они много весят, поэтому выкинул их из архива. Для сравнения рядом с test.exe лежит test_bug.exe, который сделан на единственном виджете. Он у меня глючит, но только при копировании через контекстное меню, через горячие клавиши ничего не портится. Для запуска test из виндовой проги RunQTEdit нужно нажать кнопку OK.
Вложения
Тип файла: zip _qt.zip (1.80 Мб, 2 просмотров)
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.02.2018, 16:41  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Возможно, вы что-то добавили в код, что приводит к такому поведению.
Да, вполне возможно. У меня же не просто QTextEdit, а производный от него класс со всякими дополнительными финтифлюшками. Значит, буду в эту сторону смотреть. Сделаю чистый QTextEdit, и буду навешивать на него потихонечку свои заморочки.
В любом случае спасибо за участие и поддержку.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
01.03.2018, 23:11  [ТС]
Господа и Дамы! Леди и Джентельмены! Могу с полным основанием заявить - Если долго мучиться - что-нибудь получится!
Мучения вылились в три строчки кода, и (тьфу-тьфу) ЭТО вдруг заработало.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
static STARTUPINFO info;    
static PROCESS_INFORMATION pi = { 0 };
static HWND whoFor;
// --------------
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM /*lParam*/)
{
   DWORD dwPID = 0;
   ::GetWindowThreadProcessId(hwnd, &dwPID);
   if (dwPID && dwPID == (DWORD) pi.dwProcessId) {
     HWND whoNow = GetForegroundWindow();  // Кто теперь сверху?
     if (whoFor == whoNow)  // Тот, кто вызывал ?
       ::SetForegroundWindow((HWND)hwnd);  
     return false;  // Остановка перебора
   }
   return true;
}
// --------------
static int CallJup(char *com)
{
  whoFor = GetForegroundWindow();  // Кто сверху ? (до вызова)
  info.cb = sizeof(info);
  bool k = ::CreateProcess(NULL, "Qprog file.txt", NULL, NULL, false,
             DETACHED_PROCESS | 0x08000,  // ABOVE_NORMAL_PRIORITY_CLASS,
             NULL, NULL, &info, &pi);
  if (!k) // Сообщение об ошибке
  while(1) {
    DWORD dwWait = WaitForSingleObject(pi.hProcess, 40);  // Ждем 40 мс
    if ( dwWait == WAIT_OBJECT_0 ) {  // Q закончилась
      return 0;
    }
    MSG msg;  // Это нужно, чтобы W могла перерисовать свои окна при движении окна Q
    if (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
      ::TranslateMessage(&msg);
      if (msg.message==WM_PAINT) ::DispatchMessage(&msg);
      ::EnumWindows(&EnumWindowsProc, NULL);  
    }
  }
}
// ---------------
Попутно решилась еще одна проблемка... Но радоваться просто боюсь. Подождем до утра, которое мудренее...
Не исповедимы пути твои, Виндоус! Блажен тот, кто живым выбрался из тенет твоих!
Всем участникам обсуждения - огромное спасибо! Без вашего участия я бы давно уже повесил буйну голову свою.
Всем - удачи и доброго здоровья!

Добавлено через 19 минут
Ygg, Дык, а куда деваться? Уволят на фиг без выходного пособия! А на одну пенсию при моих и жены моей запросах - не проживешь!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.03.2018, 23:46
Я так и не понял что бы делал и для чего.

Цитата Сообщение от Байт Посмотреть сообщение
// Это нужно, чтобы W могла перерисовать свои окна при движении окна Q
А по нормальному, в отдельный поток?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.03.2018, 11:39  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А по нормальному, в отдельный поток?
Дык, Q-программа и так в отдельном потоке. Изначально. Это как-бы модальный диалог, но осуществляемый другой программой, другим потоком.
Цитата Сообщение от Avazart Посмотреть сообщение
Я так и не понял что бы делал и для чего.
Не понял, в чем задача? Или как я ее решил? Вот последнего я сам не понимаю.
А на мысль натолкнуло вот что. Ну, восстанавливаю я Q-программу каждые 40 мск на переднем плане. Все правильно, пока пользователь с ней не отработает, с W-программой ему делать нечего. Но! В это время Юзер может захотеть с другой программой поработать. С тем же Вордом. Написать мне письмо с благодарностью. Многозадачнось, как-никак. А ему не даю! У меня всегда Q на переднем плане и в фокусе.
Ну и решил, что возвращать управление в Q надо только тогда, когда фокус попал тому, кто это безобразие устроил.
То есть я решал другую проблему. А по ходу решил и основную.
ЗЫ. В WinAPI я не очень силен. Боюсь я его. Всегда старался обходиться тем, что дают. Обертками. В Qt тоже не считаю себя корифеем. Но двигаюсь потихоньку... Вот за время этой нанайской борьбы много полезного узнал. И там, и там. Чем и стараюсь себя утешать...
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2018, 12:54
Цитата Сообщение от Байт Посмотреть сообщение
Дык, Q-программа и так в отдельном потоке. Изначально. Это как-бы модальный диалог, но осуществляемый другой программой, другим потоком.
Вы путаете процессы и потоки ?
Я имею виду в пределах программы W ожидание вынести в другой поток.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.03.2018, 14:06  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вы путаете процессы и потоки ?
CreateProcess образует новый процесс. У которого есть свой поток. Единственный.
Цитата Сообщение от Avazart Посмотреть сообщение
в пределах программы W ожидание вынести в другой поток.
А смысл? Программа W все равно должна ждать и не рыпаться

Добавлено через 7 минут
Кстати, пока копался, нарыл такую любопытную статейку
https://rsdn.org/article/qna/ui/wndsetfg.xml
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2018, 14:15
Цитата Сообщение от Байт Посмотреть сообщение
CreateProcess образует новый процесс.
Вынесете CreateProcess и WaitFor в отдельный поток, я про этом.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
02.03.2018, 14:44  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вынесете CreateProcess и WaitFor в отдельный поток, я про это.
Это понятно. Непонятно - зачем. Это логично, если W-программа должна как-то общаться с пользователем при работе Q-программы. А она не должна! Все, что от нее нужно, чтобы она перерисовывала себя при движениях Q-окна. И не загораживала.
Т.е. Q-окно должно вести себя, как модальный диалог. И все. И больше мне от них ничего не нужно.
И, наверное, для этого есть другие способы. Ведь что происходит при вызове собственного диалога, как я понимаю (может быть, неточно и неверно). Основной Обработчик сообщений пересылает все сообщения Диалогу (его обработчику сообщений). Кроме WM_PAINT. И держит Диалог НАД СОБОЙ. И никакими силами этого их взаимодействия не нарушить. Если я щелкаю где-то вне Диалога, он начинает подмигивать - мол, иди сюда. Тоже было бы приятно такое поведение реализовать...
А мне нужно, чтобы W-окно посылало все сообщения (опять же, кроме PAINT) вот этой ДРУГОЙ программе. Вот это я и пытаюсь реализовать с помощью ::SetForegroundWindow(. Просто ничего другого не нарыл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2018, 14:44
Помогаю со студенческими работами здесь

Программы вылетает при вызове метода
Подскажите пожалуйста почему программа вылетает при вызове метода? #include &lt;stdarg.h&gt; using namespace std; class...

Сбой программы при вызове формы
Добавил еще одну форму. В коде второй формы ничего не трогал, только дизайн изменил. Далее из первой формы пытаюсь вызвать по буттом вторую...

При вызове внешней программы остальное не работает
Есть такой кусочек кода: if volts &lt; previous_voltage: command=os.system(&quot;sudo shutdown -h now&quot;) ...

Падение программы при вызове функции из DLL
Есть код на C++ #ifdef __WIN32__ #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif extern &quot;C&quot;...

Падение программы при вызове QImage::color(int x) const
При выполнении данной строчки кода, программа ложится QRgb temp; temp = image.color(j); Пересмотрел документацию, не понимаю в чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru