Попробовал у себя - все открывается и закрывается.
Почему может на закрываться - тогда остается только одно: не хватает прав. Попробовать лог запустить от имени Администратора.
Вид для печати
Не знаю. Не пробовал. Использую досанкционную версию 15.24.
Всегда https://skr.sh/sMRxyYzAXnp
Ну, да ладно. "Не самая главная деталь в самолёте" (С)
Обнаружил причину. Не закрывается, если установлена эта галка https://skr.sh/sMrMOD27ses
Если галку снять - SDC открывается и закрывается при смене вида.
Можно победить? "Сворачивать в трей при старте" не хотелось бы отключать.
Корректно закрыть "чужое" приложение можно только одним способом - послав его главному окну сообщение WM_CLOSE. При работе в трее, у программы окон нет и сообщение соответственно посылать некому. Во всяком случае я другого способа закрытия чужого приложения не нашел. Можно конечно тупо убивать процесс, но это не корректно и чревато проблемами.
Да почему, если в проге нет специальной обработки WM_CLOSE, как "Sett no-kill window", то этим сообщением можно закрыть корректно , зная хэндл. Хоть в трее оно, хоть вообще скрыто с глаз, видно только в процессах.
Вот закрытие
Вложение 347552
а вот поиск хэндла
Вложение 347553
Приветствую Виталий! Да это и есть тот способ, которым у меня и закрываются приложения. Все бы хорошо, только вот для приложений, написанных на Qt он не действует. Вернее действует, но не так, как нужно.
Кстати, можешь провести интересный эксперимент - возьми приложение JTDX и попробуй у него хендл главного окна найти тем кодом, что ты привел. У меня получается интересный эффект - возвращается хендл того окна, которое в JTDX активно. Т.е. если активно главное окно, для которого и посылается сообщение WM_CLOSE, то программа закроется, а если активно окно водопада - то закроется только это окно, а не вся JTDX.
C SDC я еще не пробовал, но думаю, там таже история. От сюда и проблема закрытия SDC когда оно в трее.
Алексей привет! Это рабочий код, которым у меня открывается и закрывается SDC - хоть в трее, хоть вообще hide на него сделай - будет работать. Окно в трее это вообще не проблема для закрытия. Обрати внимание на функцию поиска хендла, и какой класс там используется
- - - Добавлено - - -
Ну смотри,
Вложение 347573
это два совершенно разных дескриптора.
Посмотри функцию поиска hwnd - она у тебя косячит.
Если использовать приведенный мною код, то вначале ловишь класс , он в данном случае "Qt5151QWindowIcon", потом имя файла ( jtdx.exe), а потом правильный caption
Вот этот код присвоит _HWND_JTDX правильный дискриптор:
bool __stdcall EnumProcJTDX(HWND _HWND)
{
if(_HWND)
{
HGLOBAL _HGLOBAL = GlobalAlloc(GMEM_SHARE, sizeof(unsigned long));
DWORD * _PID = (unsigned long *) GlobalLock(_HGLOBAL);
DWORD _RESULT = GetWindowThreadProcessId(_HWND, _PID);
if(_RESULT)
{
char _CLASS [ 95]; char _TITLE [110];
GetClassName (_HWND, _CLASS, 95); GetWindowText(_HWND, _TITLE, 110);
AnsiString Class = _CLASS;
if(Class == "Qt5151QWindowIcon")
{
int P_ID1=-666; PROCESSENTRY32 *Proc1=new PROCESSENTRY32();
HANDLE Han1; Han1=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); Proc1->dwSize=sizeof(PROCESSENTRY32);
if(Process32First(Han1,Proc1))
{
do
{
if(LowerCase(StrPas(Proc1->szExeFile))==LowerCase("jtdx.exe") )
{
if(Proc1->th32ProcessID == (int)*_PID){
char chBuff2[MAX_PATH + 1];
if (GetWindowText(_HWND,chBuff2,MAX_PATH)!=0) {
const AnsiString sWindowName1(chBuff2);
if(sWindowName1.AnsiPos("JTDX by HF community ")!=0){
_HWND_JTDX = _HWND; P_ID1=Proc1->th32ProcessID;
}
}
break;
}
}
} while(Process32Next(Han1,Proc1)); //Ïîñìîòðèì âñå ïðîöåññû â ñèñòåìå
}
delete Proc1;
CloseHandle(Han1);
}
}
}
return true;
}
Спасибо!
Но у тебя код заточен под конкретную программу. В частности - if(Class == "Qt5151QWindowIcon") . Т.е. для программ на Qt.
У меня то "общий" код под любую программу.
Я у себя в коде нашел, почему когда в тее не закрывается
function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
PID: DWORD;
begin
Result := True;
GetWindowThreadProcessID(Wnd, @PID);
if (PID = EI.ProcessID) and IsWindowVisible(Wnd) and (GetWindow(Wnd, GW_OWNER) = 0) then
begin
Result := False;
EI.HWND := Wnd; //break on return FALSE
end;
end;
Но все равно - не уверен что для Qt окон это сработает. А SDC у меня запускается в логе на "общих" правах, и отдельной функции закрытия под нее делать бы не хотелось.
Дело в том, что по неясным для меня причинам, если несколько программ "висит" на TCI - начинаются "глюки". В частности - самопроизвольные закрытия программ. Поэтому у меня ранее и возник вопрос, чтоб при смене вида LogHX с CW (с программой SDC) на DIGI (с программой JTDX) закрывалась ненужная для JTDX программа SDC. Пока запускаю и закрываю SDC руками.
Кстати, в 5M Contest, при работе в CW или RTTY тестах с SDC ничего не отваливается и не закрывается, хотя тот же TCI... Респект!