Borland C++ Builder FAQ
ОГЛАВЛЕНИЕ
Получение текущей даты и времени (VCL вариант)
// для получения текущей даты и времени воспользуйтесь функцией
// Now() из модуля Sysutils.hpp . Отобразить полученные дату и
// время можно следующим образом (Button1 - кнопка на форме):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Caption = DateTimeToStr(Now());
}
Получение текущего времени (VCL вариант)
// для получения текущего времени воспользуйтесь функцией Time()
// из модуля Sysutils.hpp . Отобразить полученную дату можно
// следующим образом (Button1 - кнопка на форме):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Caption = DateTimeToStr(Time());
}
Получение дня недели (VCL вариант)
// для получения дня недели воспользуйтесь функцией DayOfWeek()
// из модуля Sysutils.hpp, передав ей текущую дату. DayOfWeek
// возвращает значение от 1 до 7, где 1 - воскресенье,
// 2 - понедельник, и т. д.
int Day = DayOfWeek(Date());
Часы на форме с точностью до минут
Напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption = FormatDateTime("hh:nn",Time());
Timer1->Interval=10000;// меньше число, больше точность
}
Часы на форме с точностью до долей секунд
Напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Label1->Caption=Time().FormatString("hh:mm:ss:zz");
Timer1->Interval=1;
}
Как подсчитать время выполнения функции
// Напишите следующий код:
DWORD start=GetTickCount();
// тут ваша функция или как-либо действия
Edit1->Text=FloatToStr((GetTickCount()-start)/1000.);
Время в процессорных тактах
// Для того чтобы узнать время в процессорных тактах
// напишите следующую функцию:
#pragma warn -8070
__int64 Ticks()
{
asm .586
asm RDTSC
}
#pragma warn +8070
// вызов функции
__int64 i = Ticks();
Преобразование битового изображения из цветного в 256 градаций серого
// Преобразование осуществляется следующей функцией:
void SetBitmapPaletteToGreyScale(Graphics::TBitmap *pBitmap)
{
LOGPALETTE *pal;
HPALETTE hpal;
int i;
int PaletteSize; //Size of the palette buffer
pBitmap->PixelFormat = pf8bit;
pal = NULL;
PaletteSize = sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 255);
pal = (LOGPALETTE *) malloc(PaletteSize);
pal->palVersion = 0x300;
pal->palNumEntries = 256;
for (i = 0 ; i <= 255; i++)
{
pal->palPalEntry[i].peRed = i;
pal->palPalEntry[i].peGreen = i;
pal->palPalEntry[i].peBlue = i;
pal->palPalEntry[i].peFlags = PC_NOCOLLAPSE;
}
hpal = CreatePalette(pal);
if(hpal != 0) pBitmap->Palette = hpal;
free(pal);
}
Как пpоигpать MIDI без MediaPlayer-а
// Для того чтобы проиграть MIDI:
#include <mmsystem.h>
mciSendString("open anny.mid type sequencer alias MUSIC", NULL, 0, 0);
mciSendString("play MUSIC from 0", NULL, 0, 0);
Как воспроизвести звуковой файл без MediaPlayer-а
// Для того чтобы воспроизвести звуковой файл:
// напишите следующий код
#include "mmsystem.h"
DWORD fdwSound = SND_ASYNC | SND_FILENAME;
PlaySound("C:\\click.wav",NULL, fdwSound);
Как рисунок TBitmap сделать монохромным?
// напишите следующий код
BMP.Monochrome = true ; //где BMP - TBitmap
Получение метки диска
// Для получения метки диска напишите следующий код:
char DiskLabel[MAX_PATH];
char *DiskName = "c:\\"; // имя диска
GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0);
// в DiskLabel находится метка диска
Определение размера диска (VCL вариант)
// Для определения размера диска используйте функцию DiskSize, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в байтах.
__int64 Size = DiskSize(3);
Определение свободного пространства на диске (VCL вариант)
// Для определения свободного пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер свободного пространства на диске С в байтах.
__int64 FreeSpace = DiskFree(3);
Создание ярлыка
// для использования функции необходимо подключить файл
// shlobj.h
// lpszPathObj - путь к объекту, для которого будет
// создаваться ярлык
// lpszPathLink - где будет создаватья ярлык
// lpszDesc - описание ярлыка
HRESULT CreateLink(LPCSTR lpszPathObj, LPSTR lpszPathLink, LPSTR lpszDesc)
{
HRESULT hres;
IShellLink *psl;
CoInitialize(NULL);
hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
if(SUCCEEDED(hres))
{
IPersistFile *ppf;
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if(SUCCEEDED(hres))
{
wchar_t wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
hres = ppf->Save(wsz, true);
ppf->Release();
}
psl->Release();
CoUninitialize();
}
return hres;
}
Удаление файла в корзину (VCL вариант)
// разместите компонент TOpenDialog (OpenDialog1) и TButton (Button1) на форме (Form1). Для удаления файла в корзину напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
AnsiString DialogTitle = "Удаление в корзину";
SHFILEOPSTRUCT FileOpStruct;
ZeroMemory(&FileOpStruct, sizeof(SHFILEOPSTRUCT));
FileOpStruct.pFrom = (OpenDialog1->FileName + '\0').c_str();
FileOpStruct.wFunc = FO_DELETE;
FileOpStruct.fFlags = FOF_ALLOWUNDO;
FileOpStruct.lpszProgressTitle = DialogTitle.c_str();
SHFileOperation(&FileOpStruct);
}
}
Удаление файла (Вариант 1)
// Для удаления файла надо подключить к проекту Sysutils.hpp и напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString FileName="c:\\readme.txt";
if (DeleteFile(FileName)) Label1->Caption="true";
}
Удаление файла (Вариант 2)
// Для удаления файла напишите следующий код:
#include <stdio.h>
String FileName="c:\\1.txt";
remove(FileName.c_str());
Работа с файлами GIF и JPEG
// Для того, чтобы стандартными средствами C++Builder'a работать с файлами GIF и JPEG, добавьте в начало программы следующий код:
TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg",
__classid(TJPEGImage));
delete Picture;
TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TGIFImage), "gif", "gif",
__classid(TGIFImage));
delete Picture;
Преобразование *.ico файла в *.bmp
// На форме разместите TImage (Image1), TOpenDialog (OpenDialog1) и TButton (Button1). Напишите следующий обработчик события OnClick кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString as;
TIcon *pi = new TIcon();
OpenDialog1->DefaultExt = ".ICO";
OpenDialog1->Filter = "icons (*.ico)|*.ICO";
OpenDialog1->Options << ofOverwritePrompt << ofFileMustExist << ofHideReadOnly;
if (OpenDialog1->Execute())
{
pi->LoadFromFile(OpenDialog1->FileName);
as = ChangeFileExt(OpenDialog1->FileName,".BMP");
Image1->Width = Icon->Width;
Image1->Height = Icon->Height;
Image1->Canvas->Draw(0, 0, Icon);
Image1->Picture->SaveToFile(as);
}
delete pi;
}
Отображение свойств файла
// На форме разместите TOpenDialog (OpenDialog1) и TButton
// (Button1) напишите следующий обработчик события OnClick кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
SHELLEXECUTEINFO SEI;
ZeroMemory(&SEI, sizeof(SHELLEXECUTEINFO));
SEI.cbSize= sizeof(SHELLEXECUTEINFO);
SEI.lpVerb = "properties";
SEI.lpFile= OpenDialog1->FileName.c_str();
SEI.nShow = SW_SHOW;
SEI.fMask= SEE_MASK_INVOKEIDLIST;
ShellExecuteEx(&SEI);
}
}
Копирование файлов
// Для того чтобы скопировать файлы напишите следующий код:
int MoveFiles( AnsiString slSourceDir, AnsiString slTargetDir, bool toCopy = true )
{
SHFILEOPSTRUCT sh;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_FILESONLY;
sh.wFunc = toCopy ? FO_COPY : FO_MOVE;
sh.pFrom = slSourceDir.c_str();
sh.pTo = slTargetDir.c_str();
sh.hNameMappings = NULL;
sh.lpszProgressTitle = NULL;
return SHFileOperation ( &sh );
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//copy all from program files
if(!MoveFiles("c:\\program files\\*.*", "c:\\temp"))
ShowMessage("Ok");
else ShowMessage("No");
}
// В функции MoveFiles первый параметр что копировать,
// второй куда копировать
Удаление директории
// Для удаления директории напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SHFILEOPSTRUCT sh;
sh.hwnd=Form1->Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = "c:\\test\0"; //удаляемая директория
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation(&sh);
}
Вpемя создания файла
// На форме должны быть Lаbel1 и Button1, затем напишите следующий код:
TDateTime FileTimeToDateTime(FILETIME *lpftime)
{
FILETIME localfiletime;
SYSTEMTIME systime;
FileTimeToLocalFileTime(lpftime,&localfiletime);
FileTimeToSystemTime(&localfiletime,&systime);
return(TDateTime(systime.wYear, systime.wMonth, systime.wDay)+
TDateTime(systime.wHour, systime.wMinute,
systime.wSecond, systime.wMilliseconds));
}
//----------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILETIME ftCreationTime,ftLastAccessTime,ftLastWriteTime;
HANDLE hFile=(HANDLE)FileOpen("c:\\autoexec.bat",fmOpenRead);
GetFileTime(hFile,&ftCreationTime,&ftLastAccessTime,&ftLastWriteTime);
AnsiString FileInfo="FileName: c:\\autoexec.bat";
FileInfo+="\nCreation Time:"+
FormatDateTime("c",FileTimeToDateTime(&ftCreationTime));
FileInfo+="\nLast Access Time:"+
FormatDateTime("c",FileTimeToDateTime(&ftLastAccessTime));
FileInfo+="\nLast Write Time:"+
FormatDateTime("c",FileTimeToDateTime(&ftLastWriteTime));
Label1->Caption=FileInfo;
FileClose((int) hFile);
}
Поиск файлов в каталоге и его подкаталогах
// Для поиска файлов в каталоге и его подкаталогах напишите следующий код:
void ListFiles(AnsiString path, TStrings* List)
{
// Эта процедура выводит список файлов и вызывает
// саму себя для всех каталогов
TSearchRec sr;
if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
{
do
{
if (sr.Attr & faDirectory)
{
if (sr.Name!=".")
if (sr.Name!="..")
{
ListFiles(path+sr.Name+"\\",List);// Рекурсивный вызов
}
}
else
{
AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
if (Ext==".CPP")
List->Add(path+sr.Name);
}
}
while (FindNext(sr) == 0);
FindClose(sr);
}
Application->ProcessMessages();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListFiles("c:\\",Memo1->Lines);
}
Как выбрать папку из диалога (Вариант 1)
// Для того чтобы выбрать папку из диалога напишите следуюший код:
#include <FileCtrl.hpp>
.. .. .. ..
AnsiString way = "c:\\";
if(SelectDirectory("Укажите путь к папке","",way))
Label1->Caption = way;
Как выбрать папку из диалога (Вариант 2)
// Для того чтобы выбрать папку из диалога напишите следуюший код:
#include <FileCtrl.hpp>
.. .. .. ..
AnsiString way = "c:\\";
if(SelectDirectory(way,
TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
Label1->Caption = way;
Как удалить папку и все файлы в ней
// Для того чтобы удалить папку и все файлы в ней напишите следующую функцию:
bool DeleteDir(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
{
if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
do
{
if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
if (((sr.Attr & faDirectory) == faDirectory ) ||
(sr.Attr == faDirectory))// найдена папка
{
FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only
DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое
RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку
}
else// иначе найден файл
{
FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only
DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
}
}
while (!FindNext(sr));// ищем опять, пока не найдем все
FindClose(sr);
}
RemoveDir(DirName);
return true;
}
Пример регистрации собственного расширения файла
// Напишите следующую функцию:
#include <Registry.hpp>TRegistry *Reg;
Reg=NULL;
try
{
Reg=new TRegistry;
Reg->RootKey=HKEY_CLASSES_ROOT;
Reg->OpenKey("\\.ant",true);
Reg->WriteString("","MyProgram");
Reg->CloseKey();
Reg->OpenKey("\\MyProgram", true);
Reg->WriteString("","My document");
Reg->CloseKey();
Reg->OpenKey("\\MyProgram\\Shell\\Open\\Command",true);
Reg->WriteString("",ParamStr(0)+" \"%1\"");
Reg->CloseKey();
Reg->OpenKey("\\MyProgram\\DefaultIcon",true);
Reg->WriteString("",ParamStr(0)+", 1");
Reg->CloseKey();
}
__finally
{
if (Reg!=NULL)delete Reg;
}
// Весь текст генерирует расширение *.ant// А этот код загружает файл с расширением *.ant в Image1.
if (ParamCount>0)
{
asFileName=ParamStr(1);
if (FileExists(asFileName)) Image1->Picture->LoadFromFile(asFileName);
else ShowMessage(asFileName+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!");
}
Пример регистрации собственного расширения файла
// Напишите следующуй код:
if(GetDriveType("F:\\") == DRIVE_NO_ROOT_DIR)
MessageBox(NULL, "Указанного диска в системе нет!", "Внимание!", MB_OK | MB_ICONEXCLAMATION);
else
MessageBox(NULL, "Указанный диск есть в системе!", "Внимание!", MB_OK | MB_ICONINFORMATION);
Как проверить наличие дискеты в дисководе
// Напишите следующуй код:
bool IsDriveReady(char drive)
{
bool out;
WORD OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
char path[4];path[0] = drive;path[1] = ':';path[2] = '\\';path[3] = 0;
out = (SetCurrentDirectory(path) != 0);
SetErrorMode(OldErrorMode);
return out;
}
if (IsDriveReady('a'))
ShowMessage("Дискета в дисководе");
else ShowMessage("Нет дискеты");
Как программно сымитировать нажатие клавиш CTRL+V
// Напишите следующий код:
BYTE keys[256];
GetKeyboardState(keys);
keys[17] = 128;
SetKeyboardState(keys);
keybd_event(86, 0, 0, 0);
// ПРИМЕЧАНИЕ: с помощью это примера можно сымитировать
// и нажатие других комбинации, надо знать только код клавиш
Нажатие клавиши "а"
// Напишите следующий код:
keybd_event('A', 0,0,0);
keybd_event('A', 0,KEYEVENTF_KEYUP,0);
Минимизация всех окон (Win+M)
// Напишите следующий код:
keybd_event(VK_LWIN, 0, 0 ,0);
keybd_event('M', 0, 0 ,0);
keybd_event('M', 0, KEYEVENTF_KEYUP,0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);
Имитация нажатия Alt+Tab
// Напишите следующий код:
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event(VK_TAB, 0, 0 ,0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0);
Имитация нажатия CapsLock
// Напишите следующий код:
keybd_event(VK_CAPITAL, 0, 0 ,0);
keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP,0);
Имитация нажатия PrintScreen
// Напишите следующий код:
keybd_event(VK_SNAPSHOT, 0, 0 ,0);
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP,0);
Имитация нажатия PrintScreen только для формы
// Напишите следующий код:
keybd_event(VK_SNAPSHOT, 1, 0 ,0);
keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP,0);
Как переместить курсор мыши на X,Y
// Для перемещения курсора используйте функцию:
SetCursorPos(X,Y);
Позиция курсора
// Для того чтобы узнать позицию курсора напишите следующий код:
TPoint cPt;
GetCursorPos(&cPt);
ShowMessage(int(cPt.y));//Возвращает y-позицию курсора мыши
TPoint cPt;
GetCursorPos(&cPt);
ShowMessage(int(cPt.x));//Возвращает x-позицию курсора мыши
Как ограничить перемещение курсора мыши
// Для того чтобы ограничить перемещение курсора мыши какой-либо областью экран, напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RECT LR;
LR.left=100;
LR.top=100;
LR.right=500;
LR.bottom=500;
ClipCursor(&LR);// Ограничиваем в заданой области
}
// Освободить курсор можно, передав функции NULL:
ClipCursor(NULL);
Как загрузить свой курсор
// Напишите следующий код:
HWND i;
i=LoadImage(0,"cursor1.cur",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);
if (i==0)
ShowMessage("Ошибка загрузки курсора!");
else
{
Screen->Cursors[1]=i;
Form1->Cursor=1;
}
Как сделать, чтобы программа не запускалась второй раз
// Для чтобы программа не запускалась второй раз надо модифицировать проектный файл (в данном примере это Project1.cpp):
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
const char *NamedMutex= "OneOnly";
HANDLE CheckInstance(const char *Name)
{
HANDLE Mutex = CreateMutex(NULL, true,Name);
int er = GetLastError();
if (er) return 0;
return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE Mutex = CheckInstance(NamedMutex);
if (!Mutex)
{
ShowMessage("Уже работает");
ReleaseMutex(Mutex);
return 1;
}
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
Как сделать, чтобы программа не запускалась второй раз (Вариант 2)
// Для чтобы программа не запускалась второй раз напишите следующий код:
BOOL WeAreAlone(LPSTR szName)
{
HANDLE hMutex=CreateMutex(NULL,TRUE,szName);
if (GetLastError()==ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return false;
}
return true;
}//В CreatForm пишишь проверку:
if (WeAreAlone("Some_Unique_Name_Or_Other"));
else
{
ShowMessage("Такая программа уже работает!");
exit(0);
}
Как узнать каталог, где находится запускаемая программа
// Чтобы узнать каталог напишите следющий код:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Label1->Caption = Application->ExeName;
Label2->Caption = ParamStr(0);
Label3->Caption = GetCurrentDir();// текущая папка (может измениться!)
char ExeName[MAX_PATH];
GetModuleFileName(HInstance, ExeName, sizeof(ExeName));
Label4->Caption=ExeName;
}
Как убрать иконку приложения с TaskBar-a
// Напишите следющий код:
ShowWindow(Application->Handle, SW_HIDE);//Скрыть
ShowWindow(Application->Handle, SW_SHOW);//Показать
Как сделать, чтобы программа на C++Builder не требовала .bpl, .dll
Для начала надо зайти Project->Options затем: На вкладке Compiler нажать "Release", на вкладке Packages снять галку с "Build with runtime packages" и на вкладке Linker снять галку с "Use dynamic RTL"
Как поменять ICON у моей программы
Project->Options->Load Icon
Как назначить программе другой приоритет
// Напишите следющий код:
HANDLE ProcessHandle, ThreadHandle;
DWORD ProcessID = GetCurrentProcessId();
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
SetPriorityClass(ProcessHandle,HIGH_PRIORITY_CLASS);
ThreadHandle = GetCurrentThread();
SetThreadPriority(ThreadHandle,THREAD_PRIORITY_TIME_CRITICAL);
Регистрация редактора свойства типа AnsiString
// Регистрация редактора свойства типа AnsiString производится следующим образом. Напишите вспомогательную функцию:
TTypeInfo *AnsiStringTypeInfo(void)
{
TTypeInfo *typeinfo = new TTypeInfo;
typeinfo->Kind = tkLString;
typeinfo->Name = "AnsiString";
return typeinfo;
}
// ... и используйте ее в вызове RegisterPropertyEditor
// (где TMyComponent - имя класса компонента,
// MyStringProperty - имя свойства типа AnsiString,
// TMyStringPropertyEditor - имя класса редактора свойства
// типа AnsiString).
RegisterPropertyEditor(AnsiStringTypeInfo(),
__classid(TMyComponent), "MyStringProperty",
__classid(TMyStringPropertyEditor));
Мигание иконкой в панели задач
// Чтобы помигать иконкой приложения в панели задач, разместите на форме компонент TTimer (Timer1) и напишите следующий обработчик события OnTimer (предварительно выставив интервал таймера и сделав его активным):
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
FlashWindow(Application->Handle, false);
FlashWindow(Application->Handle, true);
}
Запуск скринсейвера из программы
// Следующий код запустит скринсейвер Handle - дескриптор окна вашей программы (программисты на C++Builder могут использовать Application->Handle):
SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
Скрытие таскбара
// Напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND H;
H=FindWindow("Shell_TrayWnd",NULL); //находим хандл окна таскбара
ShowWindow(H, SW_HIDE);//делаем его невидимым
Sleep(2000);
ShowWindow(H, SW_SHOW);//делаем его видимым
}
Переключение раскладки клавиатуры (конкретный язык)
// Напишите следующий код:
LoadKeyboardLayout("00000409", KLF_ACTIVATE);// Английская
LoadKeyboardLayout("00000419", KLF_ACTIVATE);// Русская
Переключение раскладки клавиатуры
// Напишите следующий код:
ActivateKeyboardLayout(0, 0);
Программная очистка корзины (для Windows 98)
// Напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/* Очистка корзины
Есть флаги - NULL - как обычно, т.е. по умолчанию
SHERB_NOCONFIRMATION 0x00000001 - без запроса на удаление
SHERB_NOPROGRESSUI 0x00000002 - без показа удаления
SHERB_NOSOUND 0x00000004 - без звука
при желании флаги можно сочетать через | */
char sh[500];
SHEmptyRecycleBin(Handle, sh, SHERB_NOSOUND|SHERB_NOCONFIRMATION);
}
Запуск браузера
// Напишите следующий код:
void __fastcall TForm1::Label1Click(TObject *Sender)
{
ShellExecute(Handle, "open", "http://google.com/",
0, 0, SW_SHOWNORMAL);
}
Запуск почтового клиента
// Напишите следующий код:
void __fastcall TForm1::Label1Click(TObject *Sender)
{
ShellExecute(Handle,NULL,"mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.?subject=Tema",
NULL,NULL,SW_SHOWNORMAL);
}
Как добавить код на ассемблере
// Ассемблеровские вставки делаются так:
asm {
// код ассемблера
}
Как сделать Shutdown (закрыть все запущенные приложения)
// напишите следующий код: HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken)) ShowMessage("OpenProcessToken"); // Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0); // Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
ShowMessage("AdjustTokenPrivileges"); // Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE , 0)) ShowMessage("ExitWindowsEx");
Какая на программа активна
// Для того что бы узнать какая программа активна кинте на форму таймер Timer1 и метку Label1 напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HANDLE hWnd;
hWnd = GetForegroundWindow();
char szTitle[41] = {0};
GetWindowText(hWnd,szTitle,40);
Label1->Caption = AnsiString(szTitle);
}
Блокировка клавиатуры и мыши
// Для блокировки клавиатуры и мыши напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hDll;
//ниже прототип будущей функции
DWORD __stdcall (*BlockInput)(bool Status);
DWORD Result;
Memo1->Lines->Add("");
Memo1->Lines->Add("Загрузка функции BlockInput()...");
hDll = LoadLibrary("User32.dll");
Memo1->Lines->Add("hDll = " + IntToHex(int(hDll), 8));
BlockInput = (DWORD __stdcall (*)(bool Status))GetProcAddress(hDll,
"BlockInput");
Memo1->Lines->Add("BlockInput = " + IntToHex(int(BlockInput), 8));
if(!BlockInput)
{
Memo1->Lines->Add("Ошибка!!!");
FreeLibrary(hDll);
return;
}
Memo1->Lines->Add("Выполняем BlockInput(true)...");
Result = BlockInput(true);
Memo1->Lines->Add("Result = " + IntToStr(Result));
if(Result)
{
Memo1->Lines->Add("Теперь клиатура и мышь доступны только, если нажать CTRL+ALT+DEL");
Memo1->Lines->Add("Ждем 15 сек...");
Sleep(15000);
}
else Memo1->Lines->Add("Ошибка!!!");
Memo1->Lines->Add("Восстанавливаем все как было...");
BlockInput(false);
FreeLibrary(hDll);
Memo1->Lines->Add("Готово.");
}
Как из тела программы запустить обработчик события (как функцию)
// напишите следующий код в нужном месте:
{
...
Form1->Button1Click(Form1);
...
}
Определение количества элементов в массиве
Чтобы в Run Time определить количество элементов в массиве, можно воспользоваться макросом ARRAYSIZE, определённым в файле sysopen.h следующим образом:
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
Имитации нажатия левой кнопки мыши
// Напищите слеующий код в нужном месте:
INPUT inp[2];
memset(inp,0,sizeof(inp));
inp[0].type=INPUT_MOUSE;
inp[0].mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
inp[1].type=INPUT_MOUSE;
inp[1].mi.dwFlags=MOUSEEVENTF_LEFTUP;
SendInput(2,inp,sizeof(INPUT));
Как послать сообщение компьютеру в локальной сети
// Для того чтобы послать сообщение компьютеру в локальной сети
// напишите следующие функции:
bool SendNetMessage(AnsiString Komp, AnsiString Mes)
{
AnsiString From;
char CompName[10];
DWORD size=10;
//Откуда
if(!GetComputerName(CompName,&size)) return false;
From=CompName;
if(Mes.Length()==0) return false;
HANDLE hSlot = CreateFile(("\\\\"+Komp+"\\mailslot\\messngr").c_str(),
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSlot == INVALID_HANDLE_VALUE) return false;
DWORD cb=0;
BOOL ret;
char *buf=new char[From.Length()+1+Komp.Length()+1+Mes.Length()+1];
//1. From
memcpy(&buf[cb],From.c_str(),From.Length()+1);
cb +=From.Length()+1; //+1 на конце должен быть 0
//2. To
memcpy(&buf[cb],Komp.c_str(),Komp.Length()+1);
cb +=Komp.Length()+1;
//3. Само сообщение
memcpy(&buf[cb],Mes.c_str(),Mes.Length()+1);
cb +=Mes.Length()+1;
//ConvertToDos
CharToOemBuff(buf,buf,cb);
ret=WriteFile(hSlot, buf,cb, &cb, NULL);
CloseHandle(hSlot);
delete[] buf;
if(!ret) return false;
return true;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Komp,Mes;
//Кому
Komp=Edit1->Text; //Имя компьютера
//Сообщение
Mes=Edit2->Text; //Message
bool ret;
int Kol=UpDown1->Position;
for(int i=1;i<=Kol;i++)
{
ret=SendNetMessage(Komp,Mes);
}
}
Как скачать файл из Интернета с конкретного сайта
// напишите следующуй код:
NMHTTP1->InputFileMode=true;
NMHTTP1->Get(" http://www.xxx.ru/pic.gif");
NMHTTP1->Body="pic.gif"; //на винт скинуть
Получение IP-адреса локальной машины
// напишите следующуй код:
#include <winsock.h>
#include <stdio.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 0);
int err = WSAStartup(wVersionRequested, &wsaData);
if(err == 0)
{
char hn[1024];
struct hostent *adr;
if(gethostname((char *)&hn, 1024))
{
int err = WSAGetLastError();
Beep();
};
adr = gethostbyname(hn);
if(adr)
{
char *LocalIp = new char[15];
sprintf(LocalIp,"%d.%d.%d.%d",
(unsigned char)adr->h_addr_list[0][0],
(unsigned char)adr->h_addr_list[0][1],
(unsigned char)adr->h_addr_list[0][2],
(unsigned char)adr->h_addr_list[0][3]);
Label1->Caption=LocalIp; //Выводим IP адрес
}
}
}
Получение имени локального компьютера
// напишите следующуй код:
#include <winsock.h>
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 0);
int err = WSAStartup(wVersionRequested, &wsaData);
if(err == 0)
{
char name[1024];
if(gethostname((char *)&name, 1024))
{
int err = WSAGetLastError();
Beep();
};
Label1->Caption=name; //выводим имя
}
Как узнать папку Windows
// Для получения папки Windows напишите следующий код:
char WindowsDirectory[MAX_PATH];
GetWindowsDirectory(WindowsDirectory, MAX_PATH);
// В WindowsDirectory содержится папка Windows
Как узнать системную папку Windows
// Для получения системной папки Windows напишите
// следующий код:
char SystemDirectory[MAX_PATH];
GetSystemDirectory(SystemDirectory, MAX_PATH);
// В SystemDirectory содержится системная папка Windows
Как спрятать кнопку "Пуск"
// для того, чтобы спрятать кнопку "Пуск", воспользуйтесь
// следующим кодом:
// Поиск кнопки
HWND hWnd;
hWnd = FindWindow("Shell_TrayWnd", NULL);
hWnd = FindWindowEx(hWnd, NULL, "BUTTON", NULL);
// Сокрытие кнопки
ShowWindow(hWnd, SW_HIDE);
// для того, чтобы вновь отобразить кнопку после сокрытия, напишите:
ShowWindow(hWnd, SW_SHOW);
Как сдвинуть кнопку "Пуск"
// Для того что бы сдвинуть кнопку "Пуск" напишите
// следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
HWND hWndBt = FindWindowEx(hWnd, NULL, "Button", NULL);
MoveWindow(hWndBt, 30, 2, 98, 32, TRUE);
}
Получение имени компьютера
// Для получения имени компьютера напишите следующий код:
unsigned long Size = MAX_COMPUTERNAME_LENGTH + 1;
char *Buffer = new char[Size];
GetComputerName(Buffer, &Size);
// после выполнения данного кода имя компьютера будет
// содержаться в Buffer. После того, как Buffer перестанет быть
// вам нужным, не забудьте вызвать delete [] Buffer.
Изменение имени компьютера
// для изменения имени компьютера воспользуйтесь функцией
// SetComputerName
SetComputerName("НОВОЕ_ИМЯ_КОМПЬЮТЕРА");
// не забудьте перезагрузить машину
Список всех шрифтов, установленных в системе (VCL вариант)
// Список всех шрифтов, установленных в системе, содержится в
// свойстве Fonts глобальной переменной Screen.
// Нижеприведенный пример показывает заполнение именами
// шрифтов выпадающего списка:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for (int i = 0; i < Screen->Fonts->Count; i++)
ComboBox1->Items->Add(Screen->Fonts->Strings[i]);
}
Как получить доступ к буферу обмена (VCL вариант)
// Для получения доступа к буферу обмена вызовите функцию
// Clipboard() из модуля Clipbrd. Функция возвращает указатель
// на экземпляр класса TClipboard
#include <Clipbrd.hpp>
Clipboard()->Clear(); // очищает буфер обмена
Как пpи стаpте пpогpаммы включить киpиллицу
// Напишите этот в начале программы:
ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID
(LANG_RUSSIAN, SUBLANG_DEFAULT) ,8).c_str(), 0), 0);
Как отобразить Диспетчер задач
// Напишите следующий код:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1)
Как добавить данные в реестр
// Напишите следующий код:
#include <Registry.hpp>
TRegistry *Registry=new TRegistry;
try
{
Registry->RootKey=HKEY_CURRENT_USER; // Ветвь реестра
Registry->OpenKey("ant47\\Test",true); // Создать новую ветвь в реестре
Registry->WriteString("DATA","15 мая"); // Создание строкового раздела
}
__finally
{
delete Registry;
}
Как изменить скорость перемещения мыши
// Напишите следующий код:
SystemParametersInfo(SPI_SETMOUSESPEED,0,(PVOID)5,SPIF_SENDCHANGE);
// где 5 - скорость. (по умолчанию - 10)
Как инвертировать кнопки мыши
// Напишите следующий код:
SwapMouseButton(true) ; // инвертировать
SwapMouseButton(false) ; // восстановить значение
Как переменную AnsiString конвертировать в char
// Напишите следующий код:
AnsiString a = "Hello World";
char *b = a.c_str();
Как переменную AnsiString конвертировать в int
// Напишите следующий код:
AnsiString a = "123456";
int i = a.ToInt();
или
int i = StrToInt(a);
Как переменную AnsiString конвертировать в float
// Напишите следующий код:
AnsiString a = "12.5";
float d;
d=a.ToDouble();
Как переменную char или int конвертировать в AnsiString
// Напишите следующий код:
char Arr[240]= "Hello World";
AnsiString Str;
Str=(AnsiString)Arr;
Как узнать длину слова в пикселях
// Напишите следующий код:
AnsiString a="Hello";
int WidthOfString = Canvas->TextWidth(a);
int HeightOfString = Canvas->TextHeight(a);
TSize SizeOfString = Canvas->TextExtent(a);
//У структуры TSize два поля cx и cy размеры
//по горизонтали и вертикали
Как конвертировать строку из кодировки WIN в KOI
// Напишите следующий код:
AnsiString S,N,C,SKoi,SWin;
SKoi="__ёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";
SWin="ёЁTюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ";
int k;
S="Строка"; //Строка WIN
for(int j=1; j<=S.Length(); j++)
{
C=S[j];
k=AnsiPos(C,SWin);
if(k==0)
N+=S[j];
else
N+=SKoi[k];
}
//N строка Koi8
Как скопировать текст из строки в Clipboard
// Напишите следующий код:
#include <clipbrd.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString s = "Hello, World !";
Clipboard()->AsText = s;
if (Clipboard()->HasFormat(CF_TEXT))
Edit1->Text = Clipboard()->AsText;
else
Application->MessageBox("The clipboard does not contain text.", NULL, MB_OK);
}
Открытие привода CD-ROM
// Чтобы программно открыть привод CD-ROM, подключите
// после vcl.h заголовочный файл mmsystem.h
// и вызовите функцию mciSendString:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
mciSendString("Set cdaudio door open wait", NULL, 0, Handle);
}
Закрытие привода CD-ROM
// Чтобы программно закрыть привод CD-ROM, подключите
// после vcl.h заголовочный файл mmsystem.h
// и вызовите функцию mciSendString:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
mciSendString("Set cdaudio door closed wait", NULL, 0, Handle);
}
Программное выключение монитора
// Следующий код выключит монитор
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
Программное включение монитора
// Следующий код включит монитор
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
Как выключить/перезагрузить компьютер
// Для включения/перезагрузки компьютера вызовите
// функцию ExitWindowsEx
// выключить компьютер
ExitWindowsEx(EWX_SHUTDOWN, 0);
// перезагрузить компьютер
ExitWindowsEx(EWX_REBOOT, 0);
// завершить сеанс пользователя
ExitWindowsEx(EWX_LOGOFF, 0);
Сколько оперативной памяти
// Для того чтобы узнать сколько оперативной
// памяти на компьютере введите следующий код:
MEMORYSTATUS mem;
memset((void*)&mem,0,sizeof(mem));
mem.dwLength=sizeof(mem);
GlobalMemoryStatus(&mem);
MessageDlg("Total memory:"+IntToStr(mem.dwTotalPhys),
mtInformation, TMsgDlgButtons() << mbOK, 0);
Как определить, подключена ли мышь
// Введите следующий код:
if(GetSystemMetrics(SM_MOUSEPRESENT))
MessageDlg("Мышь подключена!", mtInformation, TMsgDlgButtons() << mbOK, 0);
else
MessageDlg("Мышь не найдена!", mtError, TMsgDlgButtons() << mbOK, 0);
Название процессора
// Введите следующий код:
AnsiString ProcessorName="Unknown";
TRegistry *reg = new TRegistry;
try {
reg->RootKey = HKEY_LOCAL_MACHINE;
reg->OpenKey("Hardware\\Description"
"\\System\\CentralProcessor\\0", false);
ProcessorName=reg->ReadString("ProcessorNameString");
}
__finally
{
delete reg;
}
MessageDlg(ProcessorName, mtInformation, TMsgDlgButtons() << mbOK, 0);
Определение набора расширенных инструкций поддерживающий процессором
// Введите следующий код:
Memo1->Lines->Add("Поддерживаемые инструкции:");
DWORD brt; bool AMD,MMX; __asm
{
mov eax,1
cpuid
mov brt,edx
}
if(brt&(1<<23))
{
MMX=true;
Memo1->Lines->Add("MMX");
}
if(brt&(1<<25))
{
if(brt&(1<<24))
{
__try
{
__asm xorps xmm0, xmm0
Memo1->Lines->Add("SSE");
}
__except(EXCEPTION_EXECUTE_HANDLER){}
if(brt&(1<<26))
{
__try
{
__asm xorpd xmm0,xmm0
Memo1->Lines->Add("SSE2");
} __except(EXCEPTION_EXECUTE_HANDLER){}
}
}
}
__asm
{
mov eax,0x80000000
cpuid
cmp eax,0x80000000
jc notamd
mov eax,0x80000001
cpuid
mov brt,edx
mov AMD,1
notamd:
}
if(AMD)
if((MMX)&&(brt&(1<<31)))
Memo1->Lines->Add("3DNOW!");
Определение тактовой частоты CPU
// При помощи этой функции можно определить тактовую частоту CPU:
double CPUSpeed(void)
{
DWORD dwTimerHi, dwTimerLo; double dRes;
asm
{
DW 0x310F
mov dwTimerLo, EAX
mov dwTimerHi, EDX
}
Sleep (500);
asm
{
DW 0x310F
sub EAX, dwTimerLo
sub EAX, dwTimerHi
mov dwTimerLo, EAX
mov dwTimerHi, EDX
}
dRes = dwTimerLo/(1000.0*500);
return dRes;
}
Запрещение кнопки закрытия [X] формы
// Чтобы запретить кнопку закрытия формы, напишите следующий
// код (Form1- ваша форма, Button1 - кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
DeleteMenu(MenuHandle, SC_CLOSE, MF_BYCOMMAND);
}
Запрещение кнопки максимизации [[]] формы
// Чтобы запретить кнопку максимизации формы, напишите
// следующий код (Form1- ваша форма, Button1 - кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
DeleteMenu(MenuHandle, SC_MAXIMIZE, MF_BYCOMMAND);
}
// ПРИМЕЧАНИЕ: максимизация формы двойным щелчком мыши
// по заголовку также будет невозможна
Запрещение кнопки минимизации [_] формы
// Чтобы запретить кнопку минимизации формы, напишите
// следующий код (Form1- ваша форма, Button1 - кнопка на ней):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU MenuHandle = GetSystemMenu(Handle, false);
if(MenuHandle)
DeleteMenu(MenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
}
Отмена закрытия формы при нажатии Alt+F4
// Чтобы форма не закрывалась при нажатии комбинации клавиш
// Alt+F4, разместите на форме компонент TActionList(ActionList1),
// создайте новый TAction(Action1), и в свойстве ShortCut у Action1
// пропишите комбинацию клавиш Alt+F4, а обработчик события
// OnExecute должен выглядеть следующим образом
// (Form1- ваша форма):
void __fastcall TForm1::Action1Execute(TObject *Sender)
{
// чтобы при сохранении C++Builder не уничтожил обработчик
}
Отмена закрытия формы при нажатии Alt+F4 (Вариант 2)
//В обpаботчике FormKeyDown пишешь:
if (Shift.Contains(ssAlt)&&Key==VK_F4) Tag=1;
//В обpаботчике FormCloseQuery:
if(Tag)
{
CanClose=false;
Tag=0;
}
Перемещение формы мышью не за заголовок
// Напишите следующий обработчик события OnMouseDown формы
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
long SC_DRAGMOVE = 0xF012;
if(Button == mbLeft)
{
ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
}
}
Изменение размеров формы (развернуть и т.д.)
// Напишите следующий код:
Form1->WindowState = wsMaximized; // развернуть
Form1->WindowState = wsMinimized; // минимизировать
Form1->WindowState = wsNormal; // первоначальный размер
Как сделать кусок окна прозрачным
// Для того чтобы сделать кусок формы прозрачным,
// напишите следующий код:
//Прямоугольный кусок
HRGN R1=CreateRectRgn(0, 0, Width, Height);
HRGN R2=CreateRectRgn(4, 24, Width-4, Height-4);
CombineRgn(R1, R1,R2, RGN_DIFF);
SetWindowRgn(Handle, R1, TRUE);
//Кусок в виде элипса
HRGN hRgn1 = CreateRectRgn(0, 0, Width, Height);
HRGN hRgn2 = CreateEllipticRgn(0, 0, Width, Height);
HRGN hRgn3 = CreateRectRgn(0, 0, Width, Height);
CombineRgn(hRgn3, hRgn1, hRgn2, RGN_DIFF);
SetWindowRgn(Handle, hRgn3, TRUE);
//можно заменить hRgn3 на hRgn2
//Кусок в виде пятиугольника
HRGN Reg1, Reg2;
HRGN Region;
POINT p[5];
p[0] = Point(100, 0);
p[1] = Point(Width-100, 0);
p[2] = Point(Width, Height/2);
p[3] = Point(Width/2, Height);
p[4] = Point(0, Height/2);
Region = CreatePolygonRgn(p, 5, ALTERNATE);
SetWindowRgn(Handle, Region, true);
Создание новой формы во время работы программы
// Для того чтобы создать новую форму напишите:
// следующих код:
TForm * Formik= new TForm(this);
TButton* button=new TButton(Application);
button->Parent=Formik;
button->Caption="New Button";
button->Left=10;
button->Top=15;
button->Show();
Formik->Caption=123;
Formik->ShowModal();
delete Formik;
Как сделать прозрачную форму в W2K/XP
// Для того чтобы сделать прозрачную форму напишите:
int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0 , (255 * Transparency) / 100,
LWA_ALPHA);
Прозрачное окно с реакцией на нажатия кнопок, панелей
// Для того чтобы создать форму напишите:
void __fastcall TForm1::Photo()
{
int X0,Y0;
bool Flag;
TRect ScreenRect;
TCanvas* ScreenCanvas=new TCanvas;
try
{
Top=0;
Left=Screen->Width;
Width=Screen->Width;
Height=Screen->Height;
ScreenRect=Rect(0,0,Width,Height);
ScreenCanvas->Handle=GetDC(0);
Image1->Canvas->CopyRect(ScreenRect, ScreenCanvas,ScreenRect);
ReleaseDC(Handle,ScreenCanvas->Handle);
Left=Top;
} __finally
{
delete ScreenCanvas;
}
}
Новая форма как отдельное окно
// Для того чтобы создать новую форму напишите:
void __fastcall TForm1::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.WndParent = 0;
}
Приложение без формы
Создайте новый проект. Дальше: Project->Remove from projectОпределения класса окна определённого приложения
Для того чтобы определить класс определённого приложения напишите следующий код:
HWND hWnd=FindWindow(NULL,"Калькулятор");//для русскоязычной Windows
if (hWnd)
{
char buff[100];
GetClassName(hWnd,buff,100);
ShowMessage(buff);
}
Как заполнить канву формы, фоном рабочего стола
// Напишите следующий код:
PaintDesktop(Form1->Canvas->Handle);
Изменение картинки на рабочем столе
// Для изменения картинки на рабочем столе
// используйте следующий код:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "pic.bmp",
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
// где pic.bmp - имя вашего файла с картинкой
Изменение картинки на рабочем столе(вариант 2)
//Первый вариант в C++Builder 5 вызывает ругань
// BoundsChecker'a, хотя и работает.
// Нижеприведенный вариант никакой ругани не вызывает, но
// почему-то работает не на всех машинах. Для изменения картинки
// на рабочем столе используйте следующий код:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "pic.bmp",
SPIF_UPDATEINIFILE);
// где pic.bmp - имя вашего файла с картинкой
Изменение параметров экрана
// Для изменения параметров экрана используйте следующий
// код:
DEVMODE DM;
DM.dmSize = sizeof(DEVMODE);
DM.dmBitsPerPel = 16; // глубина цвета, бит на пиксель
DM.dmPelsWidth = 1024; // разрешение по горизонтали
DM.dmPelsHeight = 768; // разрешение по вертикали
DM.dmFields = DM_BITSPERPEL +
DM_PELSWIDTH +
DM_PELSHEIGHT +
DM_DISPLAYFREQUENCY;
DM.dmDisplayFrequency = 75; // частота обновления экрана
ChangeDisplaySettings(&DM, 0);
// ЗАМЕЧАНИЕ: при изменении параметров смотрите чтобы
монитор поддерживал это режим
Как узнать частоту обновления экрана
// Для получения частоты обновления экрана напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Refresh = GetDeviceCaps(hDCScreen, VREFRESH);
ReleaseDC(NULL, hDCScreen);
// в Refresh содержится частота обновления экрана по горизонтали
Как узнать разрешение экрана (VCL вариант)
// Разрешение экрана можно узнать, прочитав значения
// свойств Screen->Width и Screen->Height:
int HorzRes = Screen->Width;
int VertRes = Screen->Height;
Как узнать разрешение экрана (WinAPI вариант)
// Для получения разрешения экрана напишите следующий код:
HDC hDCScreen = GetDC(NULL);
int Horres = GetDeviceCaps(hDCScreen, HORZRES);
int Vertres = GetDeviceCaps(hDCScreen, VERTRES);
ReleaseDC(NULL, hDCScreen);
// в Horres содержится разрешение экрана по горизонтали,
// в Vertres содержится разрешение экрана по вертикали.
Как узнать разрешение экрана
// Для получения разрешения экрана напишите следующий код:
int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана
int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана
// в screenW содержится разрешение экрана по горизонтали,
// в screenH содержится разрешение экрана по вертикали.
Отображение свойств дисплея
// Следующий код отобразит на экране диалоговое
// окно свойств дисплея:
ShellExecute(NULL, "", "Desk.cpl", "", "", SW_SHOWNORMAL);
Как поместить вид рабочего стола в буфер
// Напишите следующий код:
#include <Clipbrd.hpp>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned DataHandle;
HPALETTE APalette;
Word Format;
Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
HDC DC=GetDC(0);
try
{
Bitmap->Height=Screen->Height;
Bitmap->Width=Screen->Width;
BitBlt(Bitmap->Canvas->Handle , 0, 0, Screen->Width,
Screen->Height,DC, 0, 0, SRCCOPY);
//Изображение экрана теперь в Bitmap, запишем его в бyфеp обмена
Bitmap->SaveToClipboardFormat(Format,DataHandle,APalette);
Clipboard()->SetAsHandle(Format,DataHandle);
}
__finally
{
delete Bitmap;
ReleaseDC(0,DC);
}
}
Как рисовать на Десктопе
// Напишите следующий код:
HDC hdc = CreateDC ( TEXT("DISPLAY"), NULL, NULL, NULL );
Rectangle( hdc, 100,100, 200, 200);
DeleteDC ( hdc );
Как закрасить рабочий стол по пикселю
// Напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCanvas *dt = new TCanvas ;
randomize();
dt->Handle = GetDC(0);
while (dt)
{
dt->Pixels[random(1024)][random(768)]= 0 ;
}
}