DWORD WINAPI GetProcessID(const char* NameFile)
{
HANDLE hProcSnap = NULL;
PROCESSENTRY32 ProcessEntry32;
ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);
__try
{
hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if((int)hProcSnap == -1) throw;
Process32First(hProcSnap, &ProcessEntry32);
do{
if(!strcmp(ProcessEntry32.szExeFile, NameFile))
return ProcessEntry32.th32ProcessID;
}while(Process32Next(hProcSnap, &ProcessEntry32));
}
__finally
{ if(hProcSnap)CloseHandle(hProcSnap); }
return 0;
}
Как скрыть окна некой проги а потом открыть только те которые били видны до скрытия?
Получаю PID по наименованию .exe
Код:
потом ищу окна которые принадлежат найденному PID
Код:
HWND WINAPI GetHWND(DWORD ProcesID,HWND hWnd=NULL)
{
if(!hWnd)
{
hWnd=NULL;
hWnd=::GetDesktopWindow();
hWnd=::GetWindow(hWnd,GW_CHILD);
}
while(hWnd)
{
hWnd=::GetWindow(hWnd,GW_HWNDNEXT);
DWORD dwProcID;
GetWindowThreadProcessId(hWnd,&dwProcID);
if(dwProcID==ProcesID) return hWnd;
}
return NULL;
}
{
if(!hWnd)
{
hWnd=NULL;
hWnd=::GetDesktopWindow();
hWnd=::GetWindow(hWnd,GW_CHILD);
}
while(hWnd)
{
hWnd=::GetWindow(hWnd,GW_HWNDNEXT);
DWORD dwProcID;
GetWindowThreadProcessId(hWnd,&dwProcID);
if(dwProcID==ProcesID) return hWnd;
}
return NULL;
}
При переборе приложение находить около 180 HWND.
Как вариант скрития выбрал такой:
Код:
do{
::ShowWindow(hWnd,SW_HIDE);
}while(hWnd=GetHWND(GetProcessID("MyProg.exe"),hWnd));
::ShowWindow(hWnd,SW_HIDE);
}while(hWnd=GetHWND(GetProcessID("MyProg.exe"),hWnd));
а вот при открытии тем же способом появляется окон 10 а до скрытия было 2.
Рассуждая логически то все так и должно происходить.
А чтобы было как мне надо, тогда нужно запомнить в каком то массиве значение showCmd, а потом восстановить.
Проблема в получении showCmd.
Так вот пытаюсь узнать состояние окна таким способом:
Код:
WINDOWPLACEMENT BUF;
BUF.length=sizeof(WINDOWPLACEMENT);
do{
::GetWindowPlacement(hWnd,&BUF);
::ShowWindow(hWnd,SW_HIDE);
printf("%i",BUF.showCmd);
}while(hWnd=GetHWND(ProcessID,hWnd));
BUF.length=sizeof(WINDOWPLACEMENT);
do{
::GetWindowPlacement(hWnd,&BUF);
::ShowWindow(hWnd,SW_HIDE);
printf("%i",BUF.showCmd);
}while(hWnd=GetHWND(ProcessID,hWnd));
но все значения BUF.showCmd равны 1 = SW_SHOWNORMAL;
соответственно в обратном порядке показываются опять все окна?
У кого какие идеи и варианты решения данного вопроса?
Не зачем скрывать элементы управления. У вас появляется 10 окон на экране или просто ShowWindow выполняется 10 раз? если второе, то это и есть дочерние окна, которые, разумеется, были видимы.
Возьмём к примеру winamp.exe. Отдельными окнами реализовано: плелист, еквалайзер, окно управления, и.т.д.
Так вот, если я закрыл окно плейлиста и осталось только окно управления то при сканировании находятся все окна, так как закрытие плейлиста просто переводить окно в ShowWindow(SW_HIDE);
Так ты сохраняй состояние видимости окна,и будет тебе щастье.В дальнейшем при показе будешь смотреть–если оно не было SW_Hide,то покажешь
"
Проблема в получении showCmd.
Так вот пытаюсь узнать состояние окна таким способом:
Код:
Код:
WINDOWPLACEMENT BUF;
BUF.length=sizeof(WINDOWPLACEMENT);
do{
::GetWindowPlacement(hWnd,&BUF);
::ShowWindow(hWnd,SW_HIDE);
printf("%i",BUF.showCmd);
}while(hWnd=GetHWND(ProcessID,hWnd));
BUF.length=sizeof(WINDOWPLACEMENT);
do{
::GetWindowPlacement(hWnd,&BUF);
::ShowWindow(hWnd,SW_HIDE);
printf("%i",BUF.showCmd);
}while(hWnd=GetHWND(ProcessID,hWnd));
но все значения BUF.showCmd равны 1 = SW_SHOWNORMAL;
"
::IsWindowVisible(HWND hWnd);
Всем спасибо!