Чем отличается PID от hInstance?
PID - уникальный идентификатор объекта ядра - процесса
Inst - (упрощенно) указатель на область памяти, куда загружен экземпляр модуля (экзешника, dll-ки)
Как блокировать 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); }
Как изменить разрешение экрана?
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);
[][]
Как я могy закpыть пpиложение, запyщенное по ShellExecute?
Как любое другое: получить HWND его окна; по этому HWND получить ID процесса и TerminateProcess() & WM_CLOSE для окна.
Как на 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);
Как, например, сетевую карту "отключить в данной конфигурации" через Win32 API?
Мой компьютеp->Свойства->Устpойства->NetCard->Отключено в данной конфигypации можно сделать программно:
Если в Win95 DiChangeState(lpdi, DICS_DISABLE, DICS_FLAG_CONFIGSPECIFIC); - только yчтите, что setupx.dll 16-битовая
Если в 98 или nt SetupDiChangeState
Как нарисовать рванное окно?
... 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); }
Как очистить экран в консоли 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);
Как определить, что запущен 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?
CONSOLE_SCREEN_BUFFER_INFO bi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), bi); // bi.dwCursorPosition - кооpдинаты куpсоpа
Как отследить нажата ли в текущий момент кнопка мыши с помощью API?
Смотрите GetKeyState(int nVirtKeyCode).
Коды левой, правой и средней кнопок мыши соотверственно: VK_LBUTTON,VK_RBUTTON,VK_MBUTTON или
GetAsyncKeyState(VK_LBUTTON) (соответственно, VK_RBUTTON и VK_MBUTTON).
Как перехватывать ВСЕ исключения в процессе?
main() { try { ... } catch(...) { ^^^именно так и напиши! ... } }
Так как функция main() совсем не типична для Win32, предлагаю уделить внимание SetUnhandledExceptionFilter().
Как подгрузить 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; }
Как полностью перекрыть доступ к файлу во время работы с ним?
После создания с помощью следующего кода файл даже не читается:
CreateFile(f,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Как получить список все запущенных процессов и потоков?
Для Windows 9x используйте CreateToolhelp32Snapsot/ Process32First(Process32Next)/ Thread32First(Thread32Next).
Для WinNT NTQuerySystemInformation. А можно так: получаете список окон в системе (каким угодно способом, если нужны только процессы - можно ограничиться top-level), далее - GetWindowTreadProcessID - получаете ID процесса (и нити). OpenProcess - дает handle процесса.
Как пользоваться элементом управления похожим на открытие файлов, только все это для каталогов?
Используем 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 получаешь выбранный каталог
Как поменять указатель мыши со стрелки на часики и обратно?
Используйте функции BeginWaitCursor() и EndWaitCursor(). Есть еще один (из многих) путь: void CTest::MyBiiiiigFunc() { CWaitCursor wait; for(int j=0; j
При создании объекта курсор заменяется на часики дефолтным конструктором. Деструктором - восстанавливается прежний.
Как принудительно завершить MS-DOS задачу, не дожидаясь ее нормального выхода?
DWORD ProcessID; //Здесь будет ProcessId, котоpый получили после CreateProcess HANDLE hProcess;
hProcess=OpenProcess(PROCESS_TERMINATE,0,ProcessID); if(hProcess!=NULL) { TerminateProcess(hProcess,0); CloseHandle(hProcess); }
Как программно определить тип файловой системы?
Используйте Win32 API - функцию GetVolumeInformation(...)
Как программно переключить раскладку клавиатуры?
Используйте функцию 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; }
Как программно сжать/растянуть картинку?
Смотрите Win32 API-фукнции: StretchBlt, StretchDIBits и SetStretchBltMode.
Как с помощью API организовать запись с CD-ROM'а или микрофона?
Смотрите функции: waveInOpen waveInPrepareHeader waveInAddBuffer waveInStart.Только обязательно посмотрите примеры из MSDN.
[][][]
Как сделать, чтобы некотоpое пpиложение
/*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)
Как сделать цикличным проигрывание 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; }
Как сделать какие-то действия дождавшись завершения процесса?
1. Открывать файл для записи.
2. Выяснить hWnd запушенной программы и использовать функцию IsWindow(Handle:hWnd), которая определяет, существует ли он.
3. Взять hProcess, возвращаемый CreateProcess, и возпользоваться функцией WaitForSingleObject с hProcess в качестве параметра.
Как сделать надпись перевернутую на 90 градусов?
Все как обычно, только в структуре LOGFONT установить (только TrueType шрифты):
lfOrientation = lfEscapement =900 - угол, в десятых долях град.
Кстати, Escapement приводит в повороту строки на 90 градусов, а Orientation - каждой буквы.
lfClipPrecision = CLIP_LH_ANGLES; - не забудьте установить этот флаг (под NT можно без него, а под 95/98 - никак)
Как сделать так, чтобы показывалось только имя приложения?
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.style &= ~(FWS_PREFIXTITLE|FWS_ADDTOTITLE); return TRUE; }
Как сделать так, чтобы при редактировании были видны комментарии для _своих_ методов или переменных?
1. Надо отметить, если не отмечено, все опции флажками в Tools/Options/Statement completion options;
2. Оставлять комментарии _перед_ объявлением, как например:
//Minimize to tray //Надо ли минимизировать в System Tray BOOL bTrayMin;
Как сделать так, чтобы _ресурсы_ dll были видны в пользующей его программе?
HGLOBAL LoadResource( HMODULE hModule, // хэндл модуля, откуда гpузишь pесуpс HRSRC hResInfo // идентификатоp pесуpса. );
То есть для того, чтобы загpузить pесуpсы из DLL, тебе надо загpузить DLL, а полученный хэндл использовать в LoadRecource
Как сделать так, чтобы во время выполнения длинного метода приложение реагировало на сообщения?
BOOL ProcessMessages() { MSG msgCur; if (!::GetMessage(&msgCur, NULL, NULL, NULL)) { return FALSE; }
// обрабатываем это сообщение
::TranslateMessage(&m_msgCur); ::DispatchMessage(&m_msgCur); return TRUE; }
Как сграбить экран?
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);
Как средствами API реализовать в RichEdit разноцветный текст?
CHARFORMAT cf; cf.cbSize = sizeof(cf); cf.dwMask = CFM_COLOR; cf.crTextColor = ...; file://rgb SendMessage(hwndRtf,EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);
Как убрать часы из SystemTray?
На время их можно убрать с помщью следующего кода:
hClockWnd=FindWindowEx(FindWindowEx(FindWindowEx(NULL,NULL,"Shell_TrayWnd",NULL), NULL,"TrayNotifyWnd",NULL),NULL,"TrayClockWClass",NULL); if(hClockWnd!=NULL) ShowWindow(hClockWnd,SW_HIDE);
[][][]
Как убрать кнопку с TaskBar'а?
С помощью Win32 API это можно сделать с помощью функции CreateWindowEx(), указав флаг WS_EX_TOOLWINDOW.
Как удалить .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(); }
Как установить обои на Рабочий Стол?
SystemParametrsInfo(SPI_SETDESKWALLPAPER,0,'обои.bmp',SPIF_UPDATEINIFILE);
[][][]
Как узнать частоту обновления экрана перед началом переключения, чтобы потом ее восстановить?
Смотрите функцию GetDeviceCaps, с паpаметpом VREFRESH
Как узнать количество элементов и размер корзины? Как очистить корзину?
//Очищает корзину на указанном диске SHSTDAPI SHEmptyRecycleBin( HWND hwnd, LPCTSTR pszRootPath, DWORD dwFlags);
//Получает размер и количество элементов в корзине SHSTDAPI SHQueryRecycleBin( LPCTSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
Как узнать, кто в данный момент присоединен через Сеть к машине?
Это можно узнать по сессиям:
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("Информация о сессиях не получена!");
[][][]
Как узнать наличие юзера сервере NT ?
NET_API_STATUS x=NetUserChangePassword(LPWSTR compname,LPWSTR username,
LPWSTR oldpassword,LPWSTR newpassword) - где newpassword=oldpassword.
По возвращаемому значению делаем свои выводы.Дешево и сердито.И страшных прав не надо как,например,на LogonUser().
Как узнать тип диска?
Для 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. }
Как в консольной программе выводить цветные надписи и менять палитру?
=== 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 ===
Как занести строку из 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 );
Как запустить текущего e-mail клиента?
::ShellExecute(NULL,NULL,"mailto:any@mail.ru?subject=how",NULL,NULL,SW_SHOWNORMAL);
Как заставить CHttpFile принудительно передавать файлы в бинарном виде?
По умолчанию незвестным типам файлов MFC присваивает тип text/plain. Чтобы принудительно установить бинарный режим передачи, укажите тип как application/x-ofc.
[][]
Как завесить Windows?
1. Сделать файл system.ini больше, чем 64К. Вешается при загрузке.
2. Вызвать код:
cli
jmp $
Какие существуют функции для работы с 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
Почему функция CreateProcess не запускает *.lnk-файлы?
Потому что она создает процессы только для _запускаемых_ файлов. *.lnk-файлы не являются запускаемыми.Чтобы это сделать используйте ShellExecute.
С помощью каких механизмов две программы могут обмениваться данными?
1. OLE
2. Файлы проецируемые в память
3. Секции данных, pазделяемые несколькими пpоцессами
4. WM_COPYDATA
5. Именованные (и неименованные) каналы или pipes
6. Почтовые ячейки или mailslots
7. DDE(Dynamic data exchange).