Частые вопросы по Visual C++

Google
  Главная   Новости   Статьи   Книги   Ссылки  

Часто задаваемые вопросы по Visual C++: Часть 3

Как определить, что запущен 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);
    }

Как нарисовать рванное окно?


...
   WNDCLASS WndClass;

   WndClass.lpszClassName =(LPSTR)"BalonHelp";
   WndClass.hInstance     =hInstance;
   WndClass.lpfnWndProc   =BalonWndProc;
   WndClass.style         =CS_SAVEBITS; // восстановление возлагаем на Win
   WndClass.hbrBackground =GetStockBrush(NULL_BRUSH);
   WndClass.hCursor       =LoadCursor(NULL,IDC_ARROW);
   WndClass.hIcon         =NULL;
   WndClass.lpszMenuName  =NULL;
   WndClass.cbClsExtra    =0;
   WndClass.cbWndExtra    =0;

   RegisterClass(&WndClass);
...
LRESULT CALLBACK BalonWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
  switch(msg)
  {
    case WM_PAINT:
     // отpисовка всего окна ложится на твои плечи :-)
     ...
    case ...
  }
  return DefWindowProc(hWnd,msg,wParam,lParam);
}

Как полностью перекрыть доступ к файлу во время работы с ним?

После создания с помощью следующего кода файл даже не читается:


CreateFile(f,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

Как сделать так, чтобы во время выполнения длинного метода приложение реагировало на сообщения?


BOOL ProcessMessages()
{
  MSG msgCur;
  if (!::GetMessage(&msgCur, NULL, NULL, NULL))
  {
   return FALSE;
  }


  // обрабатываем это сообщение

  ::TranslateMessage(&m_msgCur);
  ::DispatchMessage(&m_msgCur);
  return TRUE;
}

Как сделать цикличным проигрывание MIDI-файла?


LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
  if(message==MM_MCINOTIFY)
   if(wParam!=MCI_NOTIFY_ABORTED)
   {
      if(m_bIsPlaing)
      {
          if(SetMidi())
           PlayMidi();
      }
   }

  return CFrameWnd::WindowProc(message, wParam, lParam);
}

BOOL CMainFrame::SetMidi()
{
  StopMidi();
  MCI_OPEN_PARMS OpenParm;
  OpenParm.dwCallback = (DWORD)GetSafeHwnd();
  OpenParm.lpstrDeviceType = NULL;
  OpenParm.lpstrElementName = filename;
  DWORD flags=MCI_OPEN_ELEMENT;
  MCIERROR err;
  err=mciSendCommand(0, MCI_OPEN, flags,(DWORD)&OpenParm);
  if(!err){
   m_nMidideviceID=OpenParm.wDeviceID;
   return TRUE;
  }
  else
  return FALSE;
}

BOOL CMainFrame::PlayMidi(void)
{
  MCI_PLAY_PARMS PlayParm;
  PlayParm.dwCallback =(DWORD)GetSafeHwnd();
  PlayParm.dwFrom=0;
  MCIERROR err;

err=mciSendCommand(m_nMidideviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)&PlayParm);
  if(!err)
  {
   m_bIsPlaing=TRUE;
   return TRUE;
  }
  m_bIsPlaing=FALSE;
  return FALSE;
}

BOOL CMainFrame::StopMidi(void)
{
  m_bIsPlaing=FALSE;
  MCI_GENERIC_PARMS generic_params;
  generic_params.dwCallback=(DWORD)GetSafeHwnd();
  mciSendCommand(m_nMidideviceID,MCI_CLOSE,MCI_WAIT,(DWORD)&generic_params);
  return TRUE;
}

Как перехватывать ВСЕ исключения в процессе?


    main()
    {
      try {
        ...
      }
      catch(...) {
               ^^^именно так и напиши!
        ...
      }
    }

Так как функция main() совсем не типична для Win32, предлагаю уделить внимание SetUnhandledExceptionFilter().

Как узнать, кто в данный момент присоединен через Сеть к машине?

Это можно узнать по сессиям:

   SESSION_INFO_2 *psi2;
  NET_API_STATUS Result;
  wchar_t wcServerName[MAX_COMPUTERNAME_LENGTH + 1];
  DWORD prefmaxlen = MAX_PREFERRED_LENGTH;
  DWORD entriesread;
  DWORD totalentries;

  StringToWideChar( name, wcServerName, MAX_COMPUTERNAME_LENGTH );

  Result = NetSessionEnum( (LPTSTR) wcServerName, NULL, NULL, 2,
    (unsigned char**) &psi2, prefmaxlen, &entriesread,  &totalentries, NULL );
  if( Result != NERR_Success )
    throw Exception("Информация о сессиях не получена!");
Предыдущая часть Содержание Следующая часть
Используются технологии uCoz