Кибор » Кибор - Интегрированная среда разработки ботов » Предложения по программе » Деактивация окна

Страниц (1): [1]
 

1. Zireael - 12 Января, 2022 - 18:25:36 - перейти к сообщению
Добавить функцию наподобие enabledeactive, только не всё время деактивировать окно, а разово в момент вызова.
Либо как деактивировать окно?
2. Kibor - 12 Января, 2022 - 22:48:31 - перейти к сообщению
 Zireael пишет:
Добавить функцию наподобие enabledeactive, только не всё время деактивировать окно, а разово в момент вызова.

Сделать схему с enabledeactive disabledeactive когда надо.
 Zireael пишет:
Либо как деактивировать окно?

Передать фокус любому другому окну.
3. Zireael - 13 Января, 2022 - 02:58:41 - перейти к сообщению
 Цитата:
Передать фокус любому другому окну.

Как? activate активирует окно, но фокус не передаёт, если пользователь работает с другим окном.
Ардуино нажимает клавишу в одном окне, если выполнить activate другого окна, то это окно не получит фокус и в него нажатии не выполнится. Работает только если сначала деактивировать окно, в которое нажимало ардуино, а уже после этого activate.
4. Zireael - 13 Января, 2022 - 05:20:52 - перейти к сообщению
Для теста, открыть пару блокнотов и запустить скрипт.
CODE:
win w[9];
int k = window (#w[0], -1, "Notepad", -1);

pause(1000);

loop(3)
{
for(int i=0; i<k; i++)
{
activate (w[i]);
pause(500);
key('z');
sleep(100);
}
}

Напечатает в каждый блокнот zzz.
Если использовать ардуино то напечатает в один из блокнотов zzzzzz, в другой ничего.
С PS/2 также?
5. Kibor - 13 Января, 2022 - 05:36:23 - перейти к сообщению
 Zireael пишет:
С PS/2 также?

С паузой
key('z');
sleep(100);
Да.

Без
PS/2 работает нормально и с 100

===========================

Если поставить паузу 500, то работает и с PS/2 нормально.

Так же проверьте такой алгоритм

CODE:
win w[9];
int k = window (#w[0], -1, "Notepad", -1);

pause(1000);

loop(3)
{
for(int i=0; i<k; i++)
{
activate (w[i]);
pause(500);
key('z');
enabledeactive(w[i]);
sleep(100);
disabledeactive();
sleep(100);
}
}
6. Zireael - 13 Января, 2022 - 05:50:43 - перейти к сообщению
 Цитата:
Так же проверьте такой алгоритм

Про это я и писал, что при деактивации работает.
CODE:
enabledeactive(w[i]);
sleep(300);
disabledeactive();

Только зачем каждый включать/выключать, проще 1 раз выполнить код из enabledeactive чтобы деактивировать окно. Что-то вроде:
CODE:
deactivewindow(win);
7. Kibor - 13 Января, 2022 - 06:02:16 - перейти к сообщению
 Zireael пишет:
Только зачем каждый включать/выключать, проще 1 раз выполнить код из enabledeactive чтобы деактивировать окно. Что-то вроде:

Я же не знаю нужную задачу. Надо ли что бы окно всегда деактивировалось.
Увеличение паузы помогло?
8. Zireael - 13 Января, 2022 - 17:42:04 - перейти к сообщению
 Цитата:
Увеличение паузы помогло?

Нет.
 Цитата:
Я же не знаю нужную задачу.

Переключаться между окнами чтобы отправлять в них нажатия используя ардуино.
 Цитата:
Надо ли что бы окно всегда деактивировалось.

Нужно чтобы окно деактивировалось после нажатия.
1. Активировать окно.
2. Отправить нажатие используя ардуино.
3. Деактивировать окно.
4. Повторить действия для других окон. И вот тут начинаются проблемы. Если не выполнить пункт 3, то другие окна не активируются, точнее они будут выведены на передний план, при этом будут мигать в панели задач. Но фокус они не получат, у них заголовок выглядит как у фоновых окон, не активен. Нажатие выполнится в окне, которое до этого активировали.

На счёт мигания окна на панели написано тут: SetForegroundWindow
Remarks
 Цитата:
The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The process is being debugged.
The foreground process is not a Modern Application or the Start Screen.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
No menus are active.
An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user.



Вот это работает:
CODE:
external(INT, "set_port", "set_port", "Arduino.dll");
external(INT, "_key", "key", "Arduino.dll");
set_port(7);

win w[9];
int k = window (#w[0], -1, "Notepad", -1);

loop(3)
{
for(int i=0; i<k; i++)
{
activate (w[i]);
pause(500);
_key('z'); // отправка нажатия через ардуино
sleep(300);
enabledeactive(w[i]);
sleep(300);
disabledeactive();
sleep(300);
}
}

И это, работает быстро, но явно не самый надёжный вариант:
CODE:
external(INT, "set_port", "set_port", "Arduino.dll");
external(INT, "_key", "key", "Arduino.dll");
set_port(7);

win w[9];
int k = window (#w[0], -1, "Notepad", -1);

for(int i=0; i<k; i++)enabledeactive(w[i]);

loop(3)
{
for(i=0; i<k; i++)
{
activate (w[i]);
_key('z'); // отправка нажатия через ардуино
sleep(100);
}
}


Получается:
Или что-то сделать с активацией окон, тогда вопрос исчерпан.
Или деактивацией, после которой нормально срабатывает активация.
9. Kibor - 13 Января, 2022 - 23:44:34 - перейти к сообщению
Остается только применять
enabledeactive - key - disabledeactive

Никакое Api не переводит в реально активный режим при работе с PS/2
10. Zireael - 14 Января, 2022 - 03:02:17 - перейти к сообщению
Тогда уже проще кликом мыши активировать окна:
CODE:
mouse(LEFT, 0, -1, 1, w);

Powered by ExBB FM 1.0 Final