BCB常用二

本文提供了一系列Windows编程实用技巧,包括获取本地IP地址、子网掩码、改变屏幕分辨率、文件操作等,适用于不同版本的Windows系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 获得子网掩码

#include <Registry.hpp>

AnsiString GetSubnetMask()

{

    AnsiString SubnetMask;

    TRegistry *reg = new TRegistry;

    DWORD Version = GetVersion();

    if(Version < 0x80000000) //WindowsNT

    {

        reg->RootKey = HKEY_LOCAL_MACHINE;

        if(reg->OpenKeyReadOnly("SYSTEM//CurrentControlSet//Services//Tcpip//Linkage"))

        {

            int BuffLength = reg->GetDataSize("Bind");

            char *Buff = new char[BuffLength+1];

            reg->ReadBinaryData("Bind",Buff,BuffLength);

            AnsiString Interface = (AnsiString)Buff;

            Interface = Interface.SubString(9,Interface.Length()-8);

            delete [] Buff;

            reg->CloseKey();

 

            if(reg->OpenKeyReadOnly("SYSTEM//CurrentControlSet//Services//"+Interface+"//Parameters//Tcpip"))

            {

                BuffLength = reg->GetDataSize("SubnetMask");

                Buff = new char[BuffLength+1];

                reg->ReadBinaryData("SubnetMask",Buff,BuffLength);

                SubnetMask = (AnsiString)Buff;

                delete [] Buff;

            }

        }

    }

    else //Windows9X

    {

        int i;

        reg->RootKey = HKEY_LOCAL_MACHINE;

        TStringList *ent = new TStringList;

        if(reg->OpenKeyReadOnly("System//CurrentControlSet//Services//Class//NetTrans"))

            reg->GetKeyNames(ent);

        reg->CloseKey();

        for(i=0;i<ent->Count ;i++)

        {

            reg->CloseKey();

            if(reg->OpenKeyReadOnly("System//CurrentControlSet//Services//Class//NetTrans//" +ent->Strings[i]))

            {

                AnsiString ip = reg->ReadString("IPAddress");

                AnsiString node = reg->ReadString("NodeType");

                if(ip != "0.0.0.0" && ip != "" && node == "1")

                {

                    SubnetMask = reg->ReadString("IPMask");

                    if(SubnetMask != "" && SubnetMask != "0.0.0.0")

                        break;

                }

            }

        }

        delete ent;

    }

    delete reg;

    return SubnetMask;

}

 

 

#include<winsock.h>

AnsiString GetLocalIP()

{

    //Start up WinSock

    WORD wVersionRequested = MAKEWORD(1,1);;

    WSADATA wsaData;

    WSAStartup(wVersionRequested, &wsaData);

 

    hostent *p;

    char s[128];

    char *p2;

    gethostname(s,128);//获取指定计算机的名字

    p = gethostbyname(s);

    p2 = inet_ntoa(*((in_addr *)p->h_addr)); //获取指定计算机的IP地址

    WSACleanup();

    return p2;

}

 

// 打开、关闭光驱

#include "mmsystem.h"

void CDRomOpen(BOOL bOpenDrive,TCHAR cDrive)

{

    MCI_OPEN_PARMS open;

    MCI_STATUS_PARMS status;

    DWORD flags;

    TCHAR szDriveName[4];

    strcpy(szDriveName,"?:");

    ::ZeroMemory(&open,sizeof(MCI_OPEN_PARMS));

    open.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO;

    szDriveName[0] = cDrive;

    open.lpstrElementName = szDriveName;

    flags = MCI_OPEN_TYPE + MCI_OPEN_TYPE_ID + MCI_OPEN_ELEMENT + MCI_OPEN_SHAREABLE;

    if(!mciSendCommand(0,MCI_OPEN,flags,(unsigned long)&open))

    {

        status.dwItem = MCI_STATUS_READY;

        if(bOpenDrive)

            mciSendCommand(open.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0);

        else

            mciSendCommand(open.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0);

        mciSendCommand(open.wDeviceID,MCI_CLOSE,MCI_WAIT,0);

    }

}

 

 

// 得到鼠标指针的位置

POINT CurPos;

 

GetCursorPos(&CurPos);

 

// 获得端口

#include <Registry.hpp>

void __fastcall GetPort(TStrings *List)

{

    TRegistry *reg = new TRegistry;

    reg->RootKey = HKEY_LOCAL_MACHINE;

    reg->OpenKey("HARDWARE//DEVICEMAP//SERIALCOMM",true);

    reg->GetValueNames(List);

    List->BeginUpdate();

    for(int i=0;i<List->Count;i++)

        List->Strings[i] = reg->ReadString(List->Strings[i]);

    List->EndUpdate();

    delete reg;

}

// 判断操作系统

enum CWin32Type{wt3X, wtNT3, wt95, wt98, wtME, wtNT4, wt2000, wtXP, wtUnknown};

CWin32Type getWindowsVersion()

{

    CWin32Type Result;

    OSVERSIONINFO info;

    info.dwOSVersionInfoSize = sizeof(info);

 

    GetVersionEx(&info);

    switch(info.dwPlatformId)

    {

        case VER_PLATFORM_WIN32s: Result = wt3X; break;

        case VER_PLATFORM_WIN32_WINDOWS:

        {

            if(info.dwMajorVersion == 4)

            {

                if(info.dwMinorVersion == 0)

                    Result = wt95;

                else if(info.dwMinorVersion == 10)

                    Result = wt98;

                else if(info.dwMinorVersion == 90)

                    Result = wtME;

            }

            break;

        }

        case VER_PLATFORM_WIN32_NT:

        {

            if(info.dwMajorVersion == 3) // && info.dwMinorVersion == 51)

                Result = wtNT3;

            else if(info.dwMajorVersion == 4) // && info.dwMinorVersion == 0)

                Result = wtNT4;

            else if(info.dwMajorVersion == 5)

            {

                if(info.dwMinorVersion == 0)

                    Result = wt2000;

                else if(info.dwMinorVersion == 1)

                    Result = wtXP;

               

            }

            break;

        }

    }

    return Result;

}

 

// 结束一个进程

void __fastcall ProcessKill(int pPid)

{

    HANDLE ps = OpenProcess(1,false,pPid);

    if(ps && TerminateProcess(ps,-9))

    {

        MessageBox(Handle,"中止成功!","信息",MB_OK|MB_ICONINFORMATION);

    }

    else

    {

        MessageBox(Handle,"中止失败!","信息",MB_OK|MB_ICONWARNING);

    }

}

 

String __fastcall TfrmTest::GetVersionInfo(String FileName)

{

 

    FileName=ExtractFilePath(Application->ExeName)+FileName;

    if(!FileExists(FileName))

    {

     //将要更新的文件不存在

     return 0;

    }

    //首先获得版本信息资源的长度

     DWORD dwHandle,InfoSize;

     String strVer;

     InfoSize = GetFileVersionInfoSize(FileName.c_str(),&dwHandle);

     //将版本信息资源读入缓冲区

     char *InfoBuf = new char[InfoSize];

     GetFileVersionInfo(FileName.c_str(),0,InfoSize,InfoBuf);

     //获得生成文件使用的代码页及字符集信息

     char *pInfoVal;

     unsigned int dwInfoValSize;

     try

     {

      VerQueryValue(InfoBuf,"//VarFileInfo//Translation",&((void *)pInfoVal), &dwInfoValSize);

      AnsiString V = "//StringFileInfo//" +IntToHex(*((unsigned short int *) pInfoVal),4) +IntToHex(*((unsigned short int *) &pInfoVal[2]),4)+ "//FileVersion";

      //获得具体的版本号

      VerQueryValue(InfoBuf, V.c_str(),&((void *)pInfoVal),&dwInfoValSize);

      strVer=AnsiString(pInfoVal).SetLength(dwInfoValSize-1);

      delete InfoBuf;

     }

     catch(...)

     {

      return 0;

     }

     if(strVer.Length()>10)

     {

      return 0;

     }

     String TmpStr;

//截取.

     for (int i=1;i<=strVer.Length();i++)

     {

       if(strVer.SubString(i,1)!=".")

       {

        TmpStr=TmpStr+strVer.SubString(i,1);

       }

       else if((strVer.SubString(i,1)==".")&&(i==2))

       {

        TmpStr=TmpStr+strVer.SubString(i,1);

       }

     }

//截取,

     if(strVer.Pos(",")!=0)

      {

       TmpStr="";

       for (int i=1;i<=strVer.Length();i++)

       {

        if((strVer.SubString(i,1)!=",")&&(strVer.SubString(i,1)!=" "))

        {

         TmpStr=TmpStr+strVer.SubString(i,1);

        }

        else if((strVer.SubString(i,1)==",")&&(i==2))

        {

         TmpStr=TmpStr+".";

        }

      }

     }

 

     strVer=TmpStr;

     return strVer;

}

//---------------------------------------------------------------------------

// 改变分辨率

void DynamicResolution(int x,int y,int c,int h)

{

    DEVMODE CurMode;

    CurMode.dmPelsWidth = x;

    CurMode.dmPelsHeight = y;

    CurMode.dmBitsPerPel = c;

    CurMode.dmDisplayFrequency = h;

    CurMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;

    if(ChangeDisplaySettings(&CurMode, CDS_UPDATEREGISTRY) == DISP_CHANGE_SUCCESSFUL)

        MessageBox(Handle,"设置成功!","信息",MB_OK|MB_ICONINFORMATION);

    else

        MessageBox(Handle,"设置失败!","信息",MB_OK|MB_ICONINFORMATION);

}

// 显示信息,要返回其他类型的改改就可以了

String get1() // 获得分辨率

{

    TDeviceMode lpDevMode;

    EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&lpDevMode);

    return String(lpDevMode.dmPelsWidth) + " x " + String(lpDevMode.dmPelsHeight));

}

String get2() // 刷新率

{

    TDeviceMode lpDevMode;

    EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&lpDevMode);

    return String(lpDevMode.dmDisplayFrequency) + " Hz");

}

String get3() // 颜色

{

    TDeviceMode lpDevMode;

    EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&lpDevMode);

    switch(lpDevMode.dmBitsPerPel)

    {

        case 2: return " 4 色 ";

        case 4: return " 16 色 ";

        case 8: return " 256 色";

        case 16: return " 16 位增强色";

        case 24: return " 24 位真彩色";

        case 32: return " 32 位真彩色";

        default: break;

    }

}

//关闭应用程序

bool CloseApp(String ClassName)

{

    HWND ExeHandle = FindWindow(ClassName.c_str(),0);

    if(ExeHandle)

    {

         PostMessage(ExeHandle, WM_QUIT, 0, 0);

         return true;

    }

    return false;

}

 

这些都好像在www.chinabcb.com中的吧!

window 2000/XP 下窗口置前台!!!

void __fastcall SetForegroundWindowEx()

{

   if(IsWindowVisible(Handle)==0)

      Application->Restore();

   SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

   POINT xy;

   GetCursorPos(&xy);

   ShowCursor(false);

   static int clickThis;

   if(clickThis==100)

      clickThis=105;

   else

      clickThis=100;

   SetCursorPos(Left+clickThis,Top+Height-ClientHeight-4);

   mouse_event(MOUSEEVENTF_ABSOLUTE |MOUSEEVENTF_LEFTUP|MOUSEEVENTF_LEFTDOWN,0,0,0,0);

   SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

   SetCursorPos(xy.x,xy.y);

   ShowCursor(true);

}

 

]]>

// 显示Windows的关于对话框

void About()

{

    ShellAbout(Application->Handle, Application->MainForm->Caption.c_str(),"",Application->Icon->Handle);

}

void SetEditCell(TStringGrid *sg,int x,int y)

{

//任一CELLS获得焦点,并可直接使用键盘输入

TGridRect myRect;

myRect.Left = x;

myRect.Top = y;

myRect.Right = x;

myRect.Bottom = y;

sg->Selection = myRect;

sg->Options<<goEditing;

SendMessage(sg->Handle,WM_LBUTTONDOWN,0,0);

}

//------------------------------------------------------------------------

void DeleteRow(TStringGrid *sg,int x) // 删除第x行(0...)

{

for (int y=0;y<sg->ColCount;y++)

{

TStringList *ss=new TStringList();

ss->AddStrings(sg->Cols[y]);

ss->Add("");

ss->Delete(x);

sg->Cols[y]=ss;

delete ss;

}

 

这是别人写的,没测试过

//复制整个目录

void Copy_dir(AnsiString Source, AnsiString Target)

{

  SHFILEOPSTRUCT OpStruc;

  {

    OpStruc.hwnd = Handle;

    OpStruc.wFunc = FO_COPY;  //FO_COPY, FO_MOVE, FO_DELETE

    OpStruc.fFlags = FOF_SIMPLEPROGRESS;

    OpStruc.pFrom = Source.c_str();

    OpStruc.pTo = Target.c_str();

    OpStruc.lpszProgressTitle = "正在复制文件……";

  }

  SHFileOperation(&OpStruc);

}

收藏!

顶!!!

删除c:/temp/a/ 这个目录和其子目录

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

SHFILEOPSTRUCT OpStruc;

  {

    OpStruc.hwnd = Handle;

    OpStruc.wFunc = FO_DELETE;  //FO_COPY, FO_MOVE, FO_DELETE,FO_RENAME

    OpStruc.fFlags = FOF_NOCONFIRMATION;//设置自动确认,这样就可以不出现对话框了

    char From[]="c://temp//a/0/0";       // 删除c:/temp/a/ 这个目录和其子目录

    OpStruc.pFrom =From;         //设置源文件或目录

    OpStruc.pTo =NULL;        //设置目标文件或目录这里是删除文件所以可以忽略

 

//另外还有其他,在这里可以不设

  }

//执行函数

  SHFileOperation(&OpStruc);

}

 

//---------------------------------------------------------------------------

int  CopyFilesFun(String  SourceDir,String  DestDir)

{

  TSHFileOpStruct  *Dir;

  String  strTemp;

 

  Dir = (TSHFileOpStruct*)malloc(sizeof(TSHFileOpStruct));

 

  try

  {

    Dir->hwnd = Application->Handle;

    Dir->wFunc = FO_COPY;

    strTemp=SourceDir+"*.*"+'/0';

    Dir->pFrom =strTemp.c_str();

    Dir->pTo =  DestDir.c_str();

    Dir->fFlags = FOF_NOCONFIRMMKDIR+FOF_SILENT;

    SHFileOperation(Dir);

  }

  catch(...){if(Dir!=NULL){free(Dir);}}

  if(Dir!=NULL){free(Dir);}

  return  0;

}

//---------------------------------------------------------------------------

int  DeleteFileFun(String  FileDir)

{

  TSHFileOpStruct  *Dir;

  String  strTemp;

 

  Dir = (TSHFileOpStruct*)malloc(sizeof(TSHFileOpStruct));

 

  try

  {

    Dir->hwnd = Application->Handle;

    Dir->wFunc = FO_DELETE;

    strTemp=FileDir+"*.*"+'/0';

    Dir->pFrom =strTemp.c_str();

    Dir->pTo =  FileDir.c_str();

    Dir->fFlags = FOF_NOCONFIRMMKDIR+FOF_SILENT+FOF_NOCONFIRMATION;

    SHFileOperation(Dir);

  }

  catch(...){if(Dir!=NULL){free(Dir);}}

  if(Dir!=NULL){free(Dir);}

  return  0;

}

 

//获取某主机的IP地址,如果主机名为空,则返回本机的名和IP地址---------

 

  AnsiString  TForm1::gethostip(AnsiString  &  host)

  {

   WSADATA wsaData;

  AnsiString IP;

  WSAStartup(MAKEWORD(2,0),&wsaData);

  if(host.IsEmpty())

  {

   char hostname[128];

   if(gethostname(hostname,128)!=0) return AnsiString("");

   host=hostname;

  }

  try

  {

   struct hostent *hp=gethostbyname(host.c_str());

   if(WSAGetLastError()==WSAHOST_NOT_FOUND)

   {

    IP="";

    return IP;

   }

   else

   IP=inet_ntoa(*(struct in_addr*)hp->h_addr_list[0]);

   }

  catch(...)

  {

   IP="";

  }

  WSACleanup();

  return IP;

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值