007wan |
Отправлено: 14 Апреля, 2019 - 09:38:24
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , благодарю
(Добавление)
Проблема, когда запускаешь вторую программу/скрипт в кибор, то закрывает вторую, но оставляется первую, однако, не активирует мигалку в первой программе, что бы показать, что она уже имеется. Мигалка мигает 5 раз и на 6 раз остается в положении, когда она не мигает, но просто окрашивается в желтый цвет, пока окно не будет активно.
Проблема тут:
Цитата: ...однако, не активирует мигалку в первой программе, что бы...
(Добавление)
CODE:function Mutex(string s)
{
if (OpenMutex(MUTEX_ALL_ACCESS, 0, s))
{
close();
Constructor = window ("Кибор");
int FLASHWINFO1[5]={20, formatwi(w), FLASHW_TRAY | FLASHW_TIMER, 5, 0};
int FLASHWINFO2[5]={20, formatwi(w), FLASHW_STOP, 0, 0};
FlashWindow(address(#FLASHWINFO1[0]));
}
return CreateMutex(0, 1, s);
}
(Добавление)
Я думаю, что когда запуешь программу первую, то он проверяет нет ли копий этой программы, иначе закрывает(тоесть он проверяется себя), но он никак не может получить когда обнаружена эта копия оригинала, что бы дать звонок, что нужно мигать
(Добавление)
Тоесть при запуске копий - оригинал должен получить сигнал, что нужно мигать |
|
|
007wan |
Отправлено: 14 Апреля, 2019 - 10:17:39
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Всёравно не мигает, кроме того у меня запустилось 2 программы, наверное это редкий случай)
По идеи должно было так:
при запуске одной программы - ничего. При запуске второй - закрываем вторую, треть, четвертую хоть..., но после каждой открытой "копии" первая программа "оригинал" начинает мигать, но это не выходит.
CODE:function Mutex(string s)
{
if (OpenMutex(MUTEX_ALL_ACCESS, 0, s))
{
close();
Constructor = window ("Кибор");
int FLASHWINFO1[5] = {20, formatwi(Constructor), FLASHW_TRAY | FLASHW_TIMER, 5, 0};
FlashWindow(address(#FLASHWINFO1[0]));
}
return CreateMutex(0, 1, s);
} |
|
|
Zireael |
Отправлено: 15 Апреля, 2019 - 00:11:54
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: при запуске одной программы - ничего. При запуске второй - закрываем вторую, треть, четвертую хоть..., но после каждой открытой "копии" первая программа "оригинал" начинает мигать
code (Отобразить)CODE:#define MUTEX_ALL_ACCESS 2031617
#define FLASHW_TRAY 2
#define FLASHW_TIMER 4
#define FLASHW_STOP 0
external(INT, "FlashWindow", "FlashWindowEx", "User32.dll");
external(INT, "CreateMutex", "CreateMutexA", "Kernel32.dll");
external(INT, "OpenMutex", "OpenMutexA", "Kernel32.dll");
external(INT, "ReleaseMutex", "ReleaseMutex", "Kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll");
external(INT, "FindWindow", "FindWindowExA", "user32.dll");
external(INT, "GetModuleFileName", "GetModuleFileNameA", "Kernel32.dll");
char name[16384]; // массив, в который запишется путь к exe
char buffer[1]; // буфер кибор, тут будем проверять надо мигнуть или нет
string name_exe; // переменная для имени exe
GetModuleFileName(0, address(#name[0]), sizearray(name)); // получить путь к exe и его имя
regexsearch(1, #name_exe, format(#name[0]), "[^\\]+(?=.exe)"); // найти имя exe
win w=window(name_exe); // получить указатель на запускаемый exe
int FLASHWINFO1[5]={20, formatwi(w), FLASHW_TRAY | FLASHW_TIMER, 0, 0};
int FLASHWINFO2[5]={20, formatwi(w), FLASHW_STOP, 0, 0};
int my_mutex=Mutex("any_name_mutex"); // в скобках имя мьютекса (любое)
enabletimer(0);
createdialog(0);
showdialog(0, "Диалог", 300, 300, 300, 300, 4, 1); // седьмым параметром должно быть 4
loop()sleep(10);
function getmessage(0, WM_CLOSE) // если нажат крестик (закрыть окно диалога)
{
ReleaseMutex(my_mutex); // освободить хендл
CloseHandle(my_mutex); // закрыть хендл
close(); // закрыть кибор
}
function Mutex(string s)
{
if(OpenMutex(MUTEX_ALL_ACCESS, 0, s))
{
find_window(name_exe); // поиск всех окон кибора и запись в его буфер что требуется мигнуь окном
close(); // если мьютекс существует, закрыть программу
}
return CreateMutex(0, 1, s); // иначе создать мьютекс
}
function find_window(string name)
{
int handle=FindWindow(0, 0, 0, name);
while (handle != 0)
{
write_buffer('1', handle);
handle=FindWindow(0, handle, 0, name);
}
}
function write_buffer(char cc, int handle) // запись в буфер кибора
{
char c[1]={cc}
writebuffer(#c[0], 1, formatiw(handle));
}
CREATE_TIMER(0, 500)
{
readbuffer(#buffer[0], 1); // читаем буфер кибора
if(buffer[0]=='1') // если 1
{
write_buffer('0', formatwi(w)); // пишем 0
FlashWindow(address(#FLASHWINFO1[0])); // начать мигать
pause(2000);
FlashWindow(address(#FLASHWINFO2[0])); // перестать мигать
}
}
Собрать в exe. При запуске 2й или больше копий этого exe они будут закрываться. Окно, запущенное первым, будет мигать на панели задач. |
|
|
007wan |
Отправлено: 15 Апреля, 2019 - 15:55:26
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Как с помощью external перехватить события, когда жмешь контрол+шифт+z.
Для чего: при нажатии этих сочетаний, останавливается скрипт, то не срабатывает функция:
CODE:
ReleaseMutex(my_mutex);
CloseHandle(my_mutex);
А если она не сработает, то при повторном запуске первой программы(оригинала, не копии), то программа выполняет эту функцию:
CODE:function Mutex(string s)
{
if(OpenMutex(MUTEX_ALL_ACCESS, 0, s))
{
find_window(name_exe); // поиск всех окон кибора и запись в его буфер что требуется мигнуь окном
close(); // если мьютекс существует, закрыть программу
}
return CreateMutex(0, 1, s); // иначе создать мьютекс
}
ИЛИ предлагаю, что бы при нажатии этих сочетаний ничего не происходило ИЛИ предлагаю, что бы Кибор сделал у себя в программе, что бы при остановке скрипта автоматически реализовал мьютекс и закрывал хендл |
|
|
Zireael |
Отправлено: 16 Апреля, 2019 - 01:32:18
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Как с помощью external перехватить события, когда жмешь контрол+шифт+z.
Сменить букву в комбинации.
Цитата: В options можно изменить горячую клавишу остановки скрипта.
То есть саму букву.
options ("stop","C" );
Будет останавливать скрипт по КОНТР ШИФТ C
В таймере отлавливать нажатие Ctrl+Shift+Z. |
|
|
007wan |
Отправлено: 16 Апреля, 2019 - 08:26:40
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Да нет. Мне нужно вообще при нажатии на эти сочетания ничего не работало, а именно остановка скрипта без изменения сочетаний. Хочу, что бы только закрытие программы происходило только через "крестик"
(Добавление)
Закрытие программы, а не остановка скрипта.
(Добавление)
Почему-то после добавления CODE:function getmessage(1, WM_CLOSE)
{
MainWindow = window ("диалог");
Status_Combobox1 = sendmessage(CB_GETCURSEL, 0, 0, formatiw(Object_Combobox1));
Status_Checkbox1 = SendMessage(Object_Checkbox1, BM_GETSTATE, 0, 0);
Status_Checkbox2 = SendMessage(Object_Checkbox2, BM_GETSTATE, 0, 0);
Status_Checkbox3 = SendMessage(Object_Checkbox3, BM_GETSTATE, 0, 0);
Status_Checkbox4 = SendMessage(Object_Checkbox4, BM_GETSTATE, 0, 0);
Status_Checkbox5 = SendMessage(Object_Checkbox5, BM_GETSTATE, 0, 0);
SendMessage(Object_Edit1, WM_GETTEXT, sizearray(Text_Edit1), address(#Text_Edit1[0]));
WritePrivateProfileString ("Default", "Object_Combobox1", format(Status_Combobox1), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox1", format(Status_Checkbox1), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox2", format(Status_Checkbox2), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox3", format(Status_Checkbox3), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox4", format(Status_Checkbox4), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Checkbox5", format(Status_Checkbox5), PathSaveSettings);
WritePrivateProfileString ("Default", "Object_Edit1", format(#Text_Edit1[0]), PathSaveSettings);
EnableWindow(formatwi(MainWindow), 1);
}
это при закрытии диалога 2, а когда открываю меню, то оно не открывается.
(Добавление)
А забыл в конце добавить. теперь работает.
Цитата:
(Добавление)
А можно ли как-то сделать у hidedialog() эффект уничтожения окна как у destroydialog()?
(Добавление)
Как нажать кнопку, как это делает пользователь, но одной функцией, без вмешательства пользователя, т.е я могу нажать кнопку мышь, а я хочу что бы кнопку можно было нажать не мышью, а функцией, котоаря потом вызовет WM_COMMAND(Отредактировано автором: 16 Апреля, 2019 - 08:34:34) |
|
|
Zireael |
Отправлено: 16 Апреля, 2019 - 11:15:57
|
Эксперт
Покинул форум
Сообщений всего: 4464
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: А можно ли как-то сделать у hidedialog() эффект уничтожения окна как у destroydialog()?
Проверить что окно скрыто и вызвать destroydialog().
Цитата: что бы кнопку можно было нажать не мышью, а функцией, котоаря потом вызовет WM_COMMAND
CODE:sendmessage(BM_CLICK, 0, 0, <указатель на кнопку>); |
|
|
|