Visual C++ FAQ
Страница 3.


 Как я могy закpыть пpиложение, запyщенное по ShellExecute?
Как любое другое: получить HWND его окна; по этому HWND получить ID процесса и TerminateProcess() & WM_CLOSE для окна.

Как программно переключить раскладку клавиатуры?
Используйте функцию ActivateKeyboardLayout (...), которая позволяет установить язык для текущего потока.

Как программно сделать eject для CD-ROM'a, ZIP'a?
BOOL EjectDrive95(char *path)
{
 HANDLE hDevice;
 DWORD dw;
 BOOL fResult;
 DIOC_REGISTERS reg;

 hDevice = CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
FILE_FLAG_DELETE_ON_CLOSE, NULL);
 if (hDevice == INVALID_HANDLE_VALUE)
  return FALSE;
  reg.reg_EAX = 0x440D;
  reg.reg_EBX = toupper(path[0]) - 'A' + 1;
  reg.reg_ECX = 0x0849;
 fResult = DeviceIoControl(hDevice,
     VWIN32_DIOC_DOS_IOCTL,®, sizeof(reg),
     ®, sizeof(reg), &dw, 0);
 CloseHandle(hDevice);
 return fResult;
}

BOOL EjectDriveNT(char *path)
{
  HANDLE hDisk;
  DWORD dwRc;
  TCHAR tsz[8];
  SECURITY_ATTRIBUTES sa;

  wsprintf(tsz, TEXT("\\\\.\\%c:"), TEXT('@') + toupper(path[0]) - 'A' + 1);
  sa.nLength = sizeof(sa);
  sa.lpSecurityDescriptor = NULL;
  sa.bInheritHandle = TRUE;
  hDisk =  CreateFile(tsz, GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,&sa,
    OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
  if (hDisk != INVALID_HANDLE_VALUE)
   {
   FlushFileBuffers(hDisk);
    return DeviceIoControl(hDisk, IOCTL_DISK_EJECT_MEDIA, NULL, 0, NULL, 0,&dwRc, NULL);
   }
  return FALSE;
}

Как убрать часы из SystemTray?
На время их можно убрать с помщью следующего кода:
  hClockWnd=FindWindowEx(FindWindowEx(FindWindowEx(NULL,NULL,"Shell_TrayWnd",NULL),
            NULL,"TrayNotifyWnd",NULL),NULL,"TrayClockWClass",NULL);
   if(hClockWnd!=NULL)
       ShowWindow(hClockWnd,SW_HIDE);

 

Как определить, что запущен Screen Saver?


Если верить справочнику по Win32 API:
bool bIsSaverActive;

SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bIsSaverActive, 0);
if (bIsSaverActive) {  ...  }
или
BOOL IsSaverRunning()
{ BOOL isNT;
  OSVERSIONINFO ovi; ovi.dwOSVersionInfoSize=sizeof(ovi);
  GetVersionEx(&ovi); isNT=(ovi.dwPlatformId==VER_PLATFORM_WIN32_NT);
  if (!isNT)
  { UINT dummy, srunning=0;
    BOOL res=SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,&srunning,0);
    SystemParametersInfo(SPI_SCREENSAVERRUNNING,srunning,&dummy,0);
    if (srunning==0) return FALSE; else return TRUE;
   }
  // это прекрасно рабоатет под '95. Но НТ могут быть проблемы
  HWND hfw=GetForegroundWindow();
  if (hfw==NULL) return TRUE;
  LONG wl=GetWindowLong(hfw,GWL_STYLE);
  if ((wl&0xF0000000)!=WS_POPUP|WS_VISIBLE) return FALSE;
  RECT rc; GetWindowRect(hfw,&rc);
  if (rc.right-rc.left!=GetSystemMetrics(SM_CXSCREEN) ||
      rc.bottom-rc.top!=GetSystemMetrics(SM_CYSCREEN)) return FALSE;
  return TRUE;
}
С помощью каких функций можно написать программу, которая использует соединения, имеющиеся в удаленном доступе?
Смотрите Win32 API-фукнции, начинающиеся с RAS.

Как программно сжать/растянуть картинку?
Смотрите Win32 API-фукнции: StretchBlt, StretchDIBits и SetStretchBltMode.

Как принудительно завершить MS-DOS задачу, не дожидаясь ее нормального выхода?
DWORD ProcessID; //Здесь будет ProcessId, котоpый получили после CreateProcess
HANDLE hProcess;

   hProcess=OpenProcess(PROCESS_TERMINATE,0,ProcessID);
   if(hProcess!=NULL)
       {
           TerminateProcess(hProcess,0);
           CloseHandle(hProcess);
       }
 
« Предыдущая статья