007wan |
Отправлено: 28 Августа, 2019 - 12:58:09
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Dantes3000 пишет: 007wan пишет: А всё, исправил.
Рады были помочь Да, всем спасибо и тебе)
(Добавление)
Как изменить Владельца собранного эксэ? Я не думаю, что когда-нибудь Кибор скажет, что "это моя программа, я ее владелец и отдавай-ка", но просто интересно можно ли изменить, да и лишний функционал не повредит. С большим кодом станет еще больше вероятность ошибок и критов, а это путь к исправлению) |
|
|
007wan |
Отправлено: 29 Августа, 2019 - 15:58:19
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Тоесть я хочу дополнить, что текст на обычной кнопке должен закрываться Textoutom и совпадать с текстом на кнопке пиксель в пикслель, а для этого надо шрифт кнопки применить к шрифту Texouta и расчитать размер кнопки и высчитать все отступы.
(Добавление)
007wan пишет: Всплыла проблема серьезного масштаба:
Код (Отобразить)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])); // перестать мигать
}
}
(Добавление)
Этот код позволяет запускать одну запущеную эксэ и мигать если запускается вторая.
Проблема: Он мигает программу Kibor исходя из того, что messagebox(name_exe); показывает Kibor, а мне надо свою программу. Но как мне заставить мигать свою программу, если еще при запуске проверяет копии таких же и на этом этапе никаких диалогов нету, а значит указатель не взять на мою программу. Потому что я понял, что она у меня не мигает, т.к при сборке я поставил "скрывать с панели задач", а мигает Kibor, которого получается нету на панели, а моя программа не запускает диалог в момент проверки на копии. Как решить? Я пробовал брать указатль и не получилось. Почему я собираю с "скрывать с панели задач", потому что есть функция в api, которая позволяет сделать свою програму и отобразить ее на панели задач, если не ошибаюсь, то он вот : SetWindowLong(gethwnd(0), GWL_EXSTYLE, GetWindowLong(gethwnd(0), GWL_EXSTYLE) + WS_EX_APPWINDOW);И тогда при сборке у меня на панели задач ТОЛЬКО моя программа, но диалог запускается ПОСЛЕ проверки других копий.
(Добавление)
А всё, исправил.
(Добавление)
Исправил так: при первом же запуске диалог открывается так? Так вот, я в момент записи в буфер, я поставил мигать мой эксэ который открыт Хочу отметить, что код, который при запуске определяет вторую программу не актуален для больших скриптов, у меня программа с большим кодом и при запуске он долго делает обработку и пока он делает обработу или дойдет до этот кода "проверки" после запуска у меня успевает открывать еще 3 копии.
(Добавление)
Хотя сам код находится в начале скрипта ну начальнее некуды)
(Добавление)
Странно - не работает.CODE:while (handle != 0)
{
write_buffer('1', handle);
handle=FindWindow(0, handle, 0, name);
}
else//не работает
{
launch();
} |
|
|
007wan |
Отправлено: 31 Августа, 2019 - 12:15:33
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Так же не работает: Цитата: Сообщение #define WM_NCCREATE 129 посылается до сообщения WM_CREATE, когда происходит начало создания окна CODE:function getmessage(0, WM_NCCREATE)
{
messagebox(1);
} (Отредактировано автором: 31 Августа, 2019 - 12:17:22) |
|
|
Nikanr |
Отправлено: 31 Августа, 2019 - 13:47:06
|
Специалист
Покинул форум
Сообщений всего: 231
Дата рег-ции: Март 2019
Репутация: 5
|
А как правильно послать в EDIT от external'a символ новой строки через SetWindowText или другим способом? Способ приведенный ниже не работает.
CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "GetWindowText", "GetWindowTextA", "User32.dll" );
external (INT, "SetWindowText", "SetWindowTextA", "User32.dll" );
int baton, okno;
char buffet[99];
string txt;
createdialog(0);
showdialog(0, "Диалог",250, 250, 250, 250, 1, 1);
loop()pause(1);
function getmessage(0, WM_CREATE)
{
okno = CreateWindow(0, "EDIT", "", 4+128+4096+1048576+2097152+8388608+1342177280, 14, 35, 100, 100, gethwnd(0), 0, 0, 0);
baton= CreateWindow(0, "BUTTON", "Послать", 8192+1342177280, 135, 100, 80, 30, gethwnd(0), 0, 0, 0);
}
function getmessage(0, WM_COMMAND)
{
if(message.lparam == baton){
SetWindowText(okno, "123\r\n123");
}
} |
|
|
007wan |
Отправлено: 31 Августа, 2019 - 16:13:57
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
[php][/php] Zireael пишет: Цитата: как вывести прясоугольник на любые контролы в диалоге так,что бы фон диалога бы цветной
https://kibor-bot.com/forum/topi...27132#1549127132 пока нет возможности проверить. Я хочу изменить только фон,а кнопки оставить системные(create window) , так нельзя? |
|
|
|