Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

   Программирование -> C/C++ -> Visual C++ - FAQ


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


1. Надо отметить, если не отмечено, все опции флажками в Tools/Options/Statement completion options;
2. Оставлять комментарии _перед_ объявлением, как например:

//Minimize to tray
//Надо ли минимизировать в System Tray
 BOOL bTrayMin;

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

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
        if( !CFrameWnd::PreCreateWindow(cs) )
                return FALSE;
        cs.style &= ~(FWS_PREFIXTITLE|FWS_ADDTOTITLE);
        return TRUE;
}

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

=== Hачало CTEST.CPP ===
#include

void main()
{
 HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
 SMALL_RECT srct;
 CHAR_INFO chiBuffer[160];
 COORD coord1, coord2;
 char ddd[666];
 CharToOem("2:5095/38 - злобный ламеpюга", ddd);
 DWORD cWritten;
 coord1.Y = 0; coord1.X = 0;
 hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
 WriteConsoleOutputCharacter(hStdout, ddd, lstrlen(ddd), coord1, &cWritten);
 for (int i = 0; i < lstrlen(ddd); i++)
 {
  WORD wColors = 1 + i * 3;
  coord1.X = i;
  WriteConsoleOutputAttribute(hStdout, &wColors, 1, coord1, &cWritten);
 }
 srct.Top = 0; srct.Left = 0; srct.Bottom = 1; srct.Right = 79;
 coord1.Y = 0; coord1.X = 0;
 coord2.Y = 1; coord2.X = 80;
 ReadConsoleOutput(hStdout, chiBuffer, coord2, coord1, &srct);
 for (i = 0; i < 50; i++)
 {
  srct.Left = (SHORT)((double)(79 - lstrlen(ddd)) * rand() / RAND_MAX);
  srct.Top = (SHORT)((double)25 * rand() / RAND_MAX);
  srct.Bottom = srct.Top + 1;
  WriteConsoleOutput(hStdout, chiBuffer, coord2, coord1, &srct);
 }
 Sleep(10000);
}
=== Конец CTEST.CPP ===

Как подгрузить Riched32.dll в InitInstance()?

BOOL CTestApp::InitInstance()
{
    HMODULE    hmod = LoadLibrary("Riched32.dll"); //Загружаем
    if(hmod == NULL){
        AfxMessageBox("RichEdit пахать не будет");
        return false;
    }

    CTestDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal(); // в TestDlg нарисован RichEdit

    FreeLibrary(hmod);    //Выгружаем

    return false;
}

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


Используйте Win32 API - функцию GetVolumeInformation(...)

Как на VC5.0 создать окошко на full-screen?

BOOL CMyWnd::Create()
{
...
CRect rect(0, 0, GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
strClass - заpегистpиpованный оконный класс.
CreateEx(WS_EX_APPWINDOW, strClass, AfxGetAppName(), WS_SYSMENU | WS_POPUP |
WS_VISIBLE, 0, 0, rect.right, rect.bottom, NULL, NULL, 0);
...
}

или

 hwnd=CreateWindowEx(0, "Name", "Title",
        WS_POPUP|WS_SYSMENU, 0, 0,
        GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
        0, 0, hInstance, 0);

Как занести строку из CEdit'a в CListBox?

m_Edit.SetWindowText("aaa\r\nbbb\r\nccc");
// в Edit теперь три строки. Ловим первую
char    buffer[100];                           // Выделяем буфер
int    count = m_Edit.GetLine(0,       // индекс строки
                              buffer,              // указатель на буфер
                              sizeof(buffer));  // размер буфера
// Если OK, то возвращает кол-во скопированных символов
buffer[count] = 0;           // Скопированная строка не заканчивается \0
m_ListBox.AddString(buffer); // В данном случае "aaa"

или с помощью MFC:

CTreeCtrl *list = (CTreeCtrl*)GetDlgItem(IDC_TREE);
list->InsertItem( string, NULL, TVI_LAST );
    

Почему функция CreateProcess не запускает *.lnk-файлы?


Потому что она создает процессы только для _запускаемых_ файлов. *.lnk-файлы не являются запускаемыми.Чтобы это сделать используйте ShellExecute.

Как поменять указатель мыши со стрелки на часики и обратно?


Используйте функции BeginWaitCursor() и EndWaitCursor(). Есть еще один (из многих) путь:

void CTest::MyBiiiiigFunc()
{
    CWaitCursor    wait;
    for(int j=0; j<0x7ffffff; j++){
        //......
        Sleep(1000);
        // И тут все время крутятся часики
    }
} // А вот тут их уже нет.
    

При создании объекта курсор заменяется на часики дефолтным конструктором. Деструктором - восстанавливается прежний.

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


По умолчанию незвестным типам файлов MFC присваивает тип text/plain. Чтобы принудительно установить бинарный режим передачи, укажите тип как application/x-ofc.

Как сграбить экран?


1. Клавиша Alt+Print Screen (не забывайте, что эффект распространяется только на текущее окно)
2. С помощью MFC это делается командами GetDC(GetDesktopWindow), затем BitBlt куда надо. RTFM: BitBlt, CreateCompatibleDC, CreateCompatibleBitmap:

     hDc = GetDC(hWndScr);
     hMemDc = CreateCompatibleDC(hDc);
     hBmpNew = CreateCompatibleBitmap(hDc, 500, 500);
     hBmpOld = SelectObject(hMemDc, hBmpNew);
     BitBlt(hMemDc, 0, 0, 500, 500, hDc, 0, 0, SRCCOPY);

Как сделать надпись перевернутую на 90 градусов?


Все как обычно, только в структуре LOGFONT установить (только TrueType шрифты):
lfOrientation = lfEscapement =900 - угол, в десятых долях град.
Кстати, Escapement приводит в повороту строки на 90 градусов, а Orientation - каждой буквы.
lfClipPrecision = CLIP_LH_ANGLES; - не забудьте установить этот флаг (под NT можно без него, а под 95/98 - никак)

Как, например, сетевую карту "отключить в данной конфигурации" через Win32 API?


Мой компьютеp->Свойства->Устpойства->NetCard->Отключено в данной конфигypации можно сделать программно:
Если в Win95 DiChangeState(lpdi, DICS_DISABLE, DICS_FLAG_CONFIGSPECIFIC); - только yчтите, что setupx.dll 16-битовая
Если в 98 или nt SetupDiChangeState

Как сделать так, чтобы _ресурсы_ dll были видны в пользующей его программе?

HGLOBAL LoadResource(
    HMODULE  hModule, // хэндл модуля, откуда гpузишь pесуpс
    HRSRC  hResInfo  // идентификатоp pесуpса.
                                     );

То есть для того, чтобы загpузить pесуpсы из DLL, тебе надо загpузить DLL, а полученный хэндл использовать в LoadRecource

Как запустить текущего e-mail клиента?

::ShellExecute(NULL,NULL,"mailto:any@mail.ru?subject=how",NULL,NULL,SW_SHOWNORMAL);


Как сделать, чтобы некотоpое пpиложение не показывалось в Task Bar, System Tray и в списке по Ctrl+Alt+Del?

/*apphider.cpp*/
/* Alexey Chubar & Paul Ishenin*/
#pragma hdrstop
#include <condefs.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string.h>
#include <stdlib.h>
USELIB("KERNEL32.lib");
#pragma argsused
extern "C" __stdcall DWORD RegisterServiceProcess(DWORD dwProcessID, DWORD
dwType);
char * ExtractFilePath(const char *Name)
{
 int i = strlen(Name), l = strlen(Name);
 char *res="\0";
 while ((i > 0)&&(Name[i] != '\\')) i--;
 if (i)
 {
   res = (char *)malloc(l - i);
   strcpy(res, Name + i + 1);
   res[l-i-1] = '\0';
 }
 return res;
}
void HideApp(DWORD dwProcessID)
{
 HWND MyHandle = GetTopWindow(0);
 DWORD WindowProcess;
 while (MyHandle != NULL)
 {
   if ((GetWindowThreadProcessId(MyHandle, &WindowProcess) != 0) &&
(WindowProcess == dwProcessID))
   {
    ShowWindow(MyHandle, SW_HIDE);
   }
   MyHandle = GetNextWindow(MyHandle, GW_HWNDNEXT);
 }
 RegisterServiceProcess(dwProcessID, 1);
}
DWORD __fastcall FindID(const char *FName)
{
 HANDLE h;
 PROCESSENTRY32 p;
 h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 p.dwSize=sizeof(p);
 if(!Process32First(h,&p))
  return -1;
 if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0)
 {
    CloseHandle(h);
    return p.th32ProcessID;
  }
 while(Process32Next(h,&p))
  if(strcmp(strlwr((char *)FName), strlwr(ExtractFilePath(p.szExeFile)))==0)
  {
    CloseHandle(h);
    return p.th32ProcessID;
   }
  CloseHandle(h);
  return -1;
}
int main(int argc, char* argv[])
{
  if (argc > 1)
  {
   DWORD ProgID=FindID(argv[1]);
   if(ProgID != (DWORD)-1)
    HideApp(ProgID);
   }
   return 0;
}

или

  _asm{
   mov eax,1
   push eax
   dec eax
   push eax
   call dword ptr[pRegisterServiceProcess]
  }

А теперь более подробно. Невидимость по Alt-Tab:

 var  WnHnd   : Integer;
 WnHnd := GetWindowLong(Application.Handle, GWL_EXSTYLE);
 WnHnd := WnHnd or WS_EX_TOOLWINDOW; {Типа Tools-окно}
 SetWindowLong(Application.Handle, GWL_EXSTYLE, WnHnd);

Невидимость в Панели Задач:

 ShowWindow[Async](Application.Handle,SW_HIDE)

Как я мог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,R, sizeof(reg),
     R, 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);
    }

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

...
   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("Информация о сессиях не получена!");

Как убрать кнопку с TaskBar'а?


С помощью Win32 API это можно сделать с помощью функции CreateWindowEx(), указав флаг WS_EX_TOOLWINDOW.

Как определить позицию курсора в консоли Win32?

  CONSOLE_SCREEN_BUFFER_INFO bi;
  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi);
  // bi.dwCursorPosition - кооpдинаты куpсоpа

Как очистить экран в консоли Win32?


Можно использовать функцию ScrollConsoleScreenBuffer или следующий код:

  COORD c;
  c.X = 0;
  c.Y = 0;
  CONSOLE_SCREEN_BUFFER_INFO bi;
  DWORD written;
  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi);
  FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ',
bi.dwSize.X*bi.dwSize.Y, c, written);
  FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED |
FOREGROUND_GREEN | FOREGRUND_BLUE /*цвет*/, bi.dwSize.X*bi.dwSize.Y, c,written);

Как узнать количество элементов и размер корзины? Как очистить корзину?

//Очищает корзину на указанном диске
SHSTDAPI SHEmptyRecycleBin(
    HWND hwnd,
    LPCTSTR pszRootPath,
    DWORD dwFlags);

//Получает размер и количество элементов в корзине
SHSTDAPI SHQueryRecycleBin(
    LPCTSTR pszRootPath,
    LPSHQUERYRBINFO pSHQueryRBInfo);

Как получить список все запущенных процессов и потоков?


Для Windows 9x используйте CreateToolhelp32Snapsot/ Process32First(Process32Next)/ Thread32First(Thread32Next).
Для WinNT NTQuerySystemInformation. А можно так: получаете список окон в системе (каким угодно способом, если нужны только процессы - можно ограничиться top-level), далее - GetWindowTreadProcessID - получаете ID процесса (и нити). OpenProcess - дает handle процесса.

Какие существуют функции для работы с COM-портом напрямую под Win9x?


Посмотрите функции:

BuildCommDCB
BuildCommDCBAndTimeouts
ClearCommBreak
ClearCommError
CommConfigDialog
EscapeCommFunction
GetCommConfig
GetCommMask
GetCommModemStatus
GetCommProperties
GetCommState
GetCommTimeouts
GetDefaultCommConfig
PurgeComm
SetCommBreak
SetCommConfig
SetCommMask
SetCommState
SetCommTimeouts
SetDefaultCommConfig
SetupComm
TransmitCommChar
WaitCommEvent

Как завесить Windows?


1. Сделать файл system.ini больше, чем 64К. Вешается при загрузке.
2. Вызвать код:
cli
jmp $

Как получить hInstance консольного приложения?


GetModuleHandle(NULL) ;

Чем отличается PID от hInstance?


PID - уникальный идентификатор объекта ядра - процесса
Inst - (упрощенно) указатель на область памяти, куда загружен экземпляр модуля (экзешника, dll-ки)

Как установить обои на Рабочий Стол?


SystemParametrsInfo(SPI_SETDESKWALLPAPER,0,'обои.bmp',SPIF_UPDATEINIFILE);

Как сделать какие-то действия дождавшись завершения процесса?


1. Открывать файл для записи.
2. Выяснить hWnd запушенной программы и использовать функцию IsWindow(Handle:hWnd), которая определяет, существует ли он.
3. Взять hProcess, возвращаемый CreateProcess, и возпользоваться функцией WaitForSingleObject с hProcess в качестве параметра.

Как отследить нажата ли в текущий момент кнопка мыши с помощью API?


Смотрите GetKeyState(int nVirtKeyCode).
Коды левой, правой и средней кнопок мыши соотверственно: VK_LBUTTON,VK_RBUTTON,VK_MBUTTON или
GetAsyncKeyState(VK_LBUTTON) (соответственно, VK_RBUTTON и VK_MBUTTON).

С помощью каких механизмов две программы могут обмениваться данными?


1. OLE
2. Файлы проецируемые в память
3. Секции данных, pазделяемые несколькими пpоцессами
4. WM_COPYDATA
5. Именованные (и неименованные) каналы или pipes
6. Почтовые ячейки или mailslots
7. DDE(Dynamic data exchange).

Как блокировать Alt+Tab во время выполнения программы?

CMainFrame::CMainFrame()
{
 m_nHotKeyID = 100;

 BOOL m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(), m_nHotKeyID,
  MOD_ALT, VK_TAB);

 ASSERT(m_isKeyRegistered != FALSE);
}

//Убираем блокировку при выходе из приложения
CMainFrame::~CMainFrame()
{
 BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
 ASSERT(m_isKeyUnregistered != FALSE);
}

Как опpеделить какой service pack установлен на NT ?


Смотрите функцию GetVersionEx.

Как узнать наличие юзера сервере NT ?


NET_API_STATUS x=NetUserChangePassword(LPWSTR compname,LPWSTR username,
LPWSTR oldpassword,LPWSTR newpassword) - где newpassword=oldpassword.
По возвращаемому значению делаем свои выводы.Дешево и сердито.И страшных прав не надо как,например,на LogonUser().

Как средствами API реализовать в RichEdit разноцветный текст?

CHARFORMAT cf;
cf.cbSize = sizeof(cf);
cf.dwMask = CFM_COLOR;
cf.crTextColor = ...; file://rgb
SendMessage(hwndRtf,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);

Как пользоваться элементом управления похожим на открытие файлов, только все это для каталогов?


Используем API( SHGetPathFromIDList ):

LPITEMIDLIS lpItemDList;
char  szWorkDir[MAX_LEN];

BROWSEINFO bi = {hWnd,    NULL,   m_szWorkDir,
   "Выберите каталог",
   BIF_DONTGOBELOWDOMAIN,
   NULL,
   NULL,
   0
  };
  if(!(lpItemDList=SHBrowseForFolder(&bi))) return 0;
  SHGetPathFromIDList(lpItemDList, szWorkDir);

В szWorkDir получаешь выбранный каталог

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


Смотрите функцию SHFileOperation.

Как с помощью API организовать запись с CD-ROM'а или микрофона?


Смотрите функции: waveInOpen waveInPrepareHeader waveInAddBuffer waveInStart.Только обязательно посмотрите примеры из MSDN.


Как узнать частоту обновления экрана перед началом переключения, чтобы потом ее восстановить?


Смотрите функцию GetDeviceCaps, с паpаметpом VREFRESH

Как узнать тип диска?


Для NT все пpосто - там надо вызвать QueryDosDevice, а остальное настолько очевидно, что описывать дольше чем самому посмотpеть ;-))
Для Win95 несколько сложнее. Я не буду выкусывать соответствующий кусок из функции опpеделения типа диска. Без контекста там не совсем понятно что к чему. Hадо только учесть, что эта функция 16-ти битная и ее надо вызывать чеpез Thunk-и. Конечно, часть того, что она делает можно сделать и в 32-х битном коде, но не все.

/************************************************************************\
* Module   : DrvType.cpp                                                *
*-----------------------------------------------------------------------*
*          :               : Original by Micro$oft corp. from MSDN      *
\************************************************************************/
/*
How to Determine Drive Types in Windows

Article ID: Q105922

*/

#include  <windows.h>
#include  <string.h>
#include    "..\SRC\IO_Const.h"

#pragma warning(disable:4704)

extern void FAR PASCAL DOS3Call(void);


   // See the "MS-DOS Programmer's Reference" for further information
   // about this structure.
typedef struct tagDEVICEPARAMS {
   BYTE  bSpecFunc;        // Special functions
   BYTE  bDevType;         // Device type
   WORD  wDevAttr;         // Device attributes
   WORD  wCylinders;       // Number of cylinders
   BYTE  bMediaType;       // Media type
                        // Beginning of BIOS parameter block (BPB)
   WORD  wBytesPerSec;     // Bytes per sector
   BYTE  bSecPerClust;     // Sectors per cluster
   WORD  wResSectors;      // Number of reserved sectors
   BYTE  bFATs;            // Number of FATs
   WORD  wRootDirEnts;     // Number of root-directory entries
   WORD  wSectors;         // Total number of sectors
   BYTE  bMedia;           // Media descriptor
   WORD  wFATsecs;         // Number of sectors per FAT
   WORD  wSecPerTrack;     // Number of sectors per track
   WORD  wHeads;           // Number of heads
   DWORD dwHiddenSecs;     // Number of hidden sectors
   DWORD dwHugeSectors;    // Number of sectors if wSectors == 0
   char  Dummy[71];        // Fuck Microsoft and Microsoft's sample code!!!
   // ----------------------  // End of BIOS parameter block (BPB)
} DEVICEPARAMS, FAR * LPDEVICEPARAMS;

// Function prototypes
static BOOL GetDeviceParameters (int nDrive,LPDEVICEPARAMS dp) ;
static BOOL IsCDRomDrive (int nDrive) ;

//-----------------------------------------------------------------
// GetDeviceParameters()
//
// Fills a DEVICEPARAMS struct with info about the given drive.
// Calls DOS IOCTL Get Device Parameters (440Dh, 60h) function.
//
// Parameters
//   nDrive   Drive number  0 = A, 1 = B, 2 = C, and so on.
//   dp       Pointer to a structure that will contain the drive's
//            parameters.
//
// Returns TRUE if it succeeded, FALSE if it failed.
//-----------------------------------------------------------------
static BOOL GetDeviceParameters (int nDrive, LPDEVICEPARAMS dp)
{
    BOOL bResult = TRUE;      // Assume success
    __asm {
         push ds
         mov  bx, nDrive
         inc  bx           // Convert 0-based #'s to 1-based #s
         mov  ch, 08h      // Device category--must be 08h
         mov  cl, 60h      // MS-DOS IOCTL Get Device Parameters
         lds  dx, dp
         mov  ax, 440Dh
         int  21h
         jnc  gdp_done     // CF SET if error
         mov  bResult, FALSE
      gdp_done:
         pop  ds
    }
    return (bResult);
}
//-----------------------------------------------------------------
// IsCDRomDrive()
//
// Determines if a drive is a CD-ROM. Calls MSCDEX and checks
// that MSCDEX is loaded, and that MSCDEX reports the drive is a
// CD-ROM.
//
// Parameters
//    nDrive    Drive number  0 = A, 1 = B, 2 = C, and so forth.
//
// Returns TRUE if nDrive is a CD-ROM drive, FALSE if it isn't.
//-----------------------------------------------------------------
static BOOL IsCDRomDrive (int nDrive)
{
    BOOL bResult = FALSE;      // Assume not a CD-ROM drive
    __asm {
         mov  ax, 150Bh       // MSCDEX CD-ROM Drive Check
         xor  bx, bx
         mov  cx, nDrive
         int  2Fh
         cmp  bx, 0ADADh      // Check MSCDEX signature
         jne  not_cd_drive
         or   ax, ax          // Check the drive type
         jz   not_cd_drive    // 0 (zero) means not CD-ROM
         mov  bResult, TRUE
      not_cd_drive:
    }
    return (bResult);
}

//-----------------------------------------------------------------
UINT GetDriveTypeEx (int nDrive)
{
    DEVICEPARAMS dp;
    UINT uType;
    UINT Drv4409Flag ;
    UINT fAddFlags = 0 ;

    _fmemset (&dp, 0, sizeof(dp));    // Init device params struct
    uType = GetDriveType (nDrive);

    switch (uType) {
      case DRIVE_REMOTE:
            // GetDriveType() reports CD-ROMs as Remote drives. Need
-7395------------------------------------------------------------------------
            // to see if the drive is a CD-ROM or a network drive.
        if (IsCDRomDrive (nDrive)) {
            return (EX_DRIVE_CDROM | EX_DRIVE_NOACCESS);
        } else {
            return (EX_DRIVE_REMOTE | EX_DRIVE_NOACCESS);
        }
        break;

      case DRIVE_REMOVABLE:
            // Check for a floppy disk drive. If it isn't, then we
            // don't know what kind of removable media it is.
            // For example, could be a Bernoulli box or something new...
        if (GetDeviceParameters (nDrive, &dp))
            switch (dp.bDevType) {
               // Floppy disk drive types
               case 0x0: case 0x1:              // 5.25" floppy
               case 0x3: case 0x4:              // 8" floppy
                  return (EX_DRIVE_FLOPPY5);
               case 0x2: case 0x7: case 0x8:    // 3.5" floppy
                  return (EX_DRIVE_FLOPPY3);
            }
        return (EX_DRIVE_REMOVABLE);  // Unknown removable media type
        break;

      case DRIVE_FIXED:
        __asm {
            xor  dx,dx
            mov  bx,nDrive
            inc  bl                    // 1-'A', 2-'B',...
            mov  ax,0x4409
            call far ptr DOS3Call
            mov  Drv4409Flag,dx
        }
        if (Drv4409Flag & 0x0100) fAddFlags |= EX_DRIVE_NOACCESS ;
            // GetDeviceParameters returns a device type of 0x05 for
            // hard disks. Because hard disks and RAM disks are the two
            // types of fixed-media drives, we assume that any fixed-
            // media drive that isn't a hard disk is a RAM disk.
        if (GetDeviceParameters (nDrive, &dp) && dp.bDevType == 0x05) {
            if (Drv4409Flag & 0x8000)
                return (EX_DRIVE_SUBSTED | fAddFlags);
            else
                return (EX_DRIVE_FIXED | fAddFlags);
        } else {
            return (EX_DRIVE_RAMDISK | fAddFlags);
        }
        break;
    }
    return (EX_DRIVE_INVALID);   // Drive is invalid if we get here.
}

Как удалить .exe-файл из самого себя?

#include <windows.h>
#include <stdio.h>

void DelSelf(void)
{
 char modulename[MAX_PATH];
 char batfile[MAX_PATH];
 char batlines[MAX_PATH*4];
 LPSTR tempdir;
 char Buf[MAX_PATH];

 GetModuleFileName(NULL,modulename,MAX_PATH);

 tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
 Buf, MAX_PATH) > 0) ? Buf : NULL);

 strcpy(batfile,tempdir);
 strcat(batfile,"\\");
 strcat(batfile,"delself.bat");
 strcpy(batlines,"@echo off\n:try\ndel ");
 strcat(batlines,modulename);
 strcat(batlines,"\nif exist ");
 strcat(batlines,modulename);
 strcat(batlines," goto try\n");
 strcat(batlines,"del ");
 strcat(batlines,batfile);

 DWORD NOfBytes;
 HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ
| FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
 CloseHandle(hbf);

 STARTUPINFO         si;
 PROCESS_INFORMATION pi;
 ZeroMemory( &si, sizeof(si) );
 si.cb = sizeof(si);
 si.wShowWindow = SW_HIDE;
 si.dwFlags = STARTF_USESHOWWINDOW;

 CreateProcess(
     NULL,
     batfile,
     NULL,
     NULL,
     FALSE,
     IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
     NULL,
     NULL,
     &si,
     &pi);

}
void main()
{
 DelSelf();
} 

Как изменить разрешение экрана?

DEVMODE dm;

ZeroMemory(&dm,sizeof(DEVMODE));
dm.dmSize=sizeof(DEVMODE);
dm.dmBitsPerPel=16;
dm.dmPelsWidth=800;
dm.dmPelsHeight=600;
dm.dmDisplayFrequency=60;
dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;

ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);


 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.