[BCB] 「すべてはい」「すべていいえ」がついたMessageBox

   TForm *Dlg=CreateMessageDialog("元のファイルが上書きされます。続行し
てもよろしいですか?",mtWarning,TMsgDlgButtons() <<mbOk<<mbNoToAll<<mbYesToAll<<mbCancel);
  Dlg->Caption="警告";
  Dlg->ShowModal();
  delete Dlg;

TMsgDlgBtn値、戻り値
mbOK、mrOk
mbCancel、mrCancel
mbYes、mrYes
mbNo、mrNo
mbAbort、mrAbort
mbRetry、mrRetry
mbIgnore、mrIgnore
mbAll、mrAll
mbNoToAll、mrNoToAll
mbYesToAll、mrYesToAll

|

[BCB] MessageBoxでデフォルトのボタンを指定する

デフォルトボタンを指定するには、以下のいずれかの値を使います。何も指定しなかった場合には、最初のボタンがデフォルトになります。

0x00000000 (MB_DEFBUTTON1)
最初のボタンをデフォルトにする
0x00000100 (MB_DEFBUTTON2)
2番目のボタンをデフォルトにする
0x00000200 (MB_DEFBUTTON3)
3番目のボタンをデフォルトにする
0x00000300 (MB_DEFBUTTON4)
4番目のボタンをデフォルトにする

例:
Application->MessageBoxA("続行しますか ?","確認",MB_OKCANCEL|MB_DEFBUTTON2);

|

[BCB] エクスプローラからのドラッグ & ドロップに対応する

//ヘッダファイル
class TForm1 : public TForm
{
    :

private:
    //実際にメッセージを処理する関数の宣言
    //関数の中身はソースに自分で書く
    void __fastcall WMDropFile(TWMDropFiles &Msg);

BEGIN_MESSAGE_MAP
    //捕まえたいメッセージと、それを処理する関数を登録
    VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFile)
END_MESSAGE_MAP(TComponent)

};

//ソースファイル

void __fastcall TForm1::FormCreate(TObject *Sender)
begin
  DragAcceptFiles(Handle, true);
end;

void __fastcall TForm1::WMDropFile(TWMDropFiles &Msg)
{
  //ドロップされたファイルを取得
  int Count=DragQueryFile((void *)Msg.Drop, -1, NULL, 0);
  for (int i=0;i<Count;i++) {
    char Filename[MAX_PATH]={0};
    DragQueryFile((void *)Msg.Drop, i, Filename, MAX_PATH);
      
    //Filenameを処理
  }
  DragFinish((void *)Msg.Drop);
}

|

[BCB] マウスの押下中だけカーソルを変更する

MouseDownイベントでVCLのCursorプロパティを変更しても、マウスのボタンが開放されるまでカーソルが変更されません。ボタンが押された瞬間に変更するにはWindows APIを使います。

::SetCursor(Screen->Cursors[crHourGlass]);

またMouseUpイベントにはカーソルを元に戻すコードを書きます。こちらは、VCLのCursorプロパティでもOKです。

Image1->Cursor=ceDefault;

|

[BCB] 独自のマウスカーソルを使う

----------------
1.まずカーソルデータが含まれたリソースファイルを作成 (参考:独自のリソースを使う

mycursor.rc

MyCursor1 CURSOR "Cursor_1.cur"
MyCursor2 CURSOR "Cursor_2.cur"

このファイルをプロジェクトに追加する。

----------------
2.メインフォームのOnCreateでリソースからカーソルを読み込む

//カーソル定数
static const TCursor crMyCursor1=1;
static const TCursor crMyCursor2=2;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Screen->Cursors[crMyCursor1] = LoadCursor(HInstance, "MyCursor1");
  Screen->Cursors[crMyCursor2] = LoadCursor(HInstance, "MyCursor2");
}

カーソル定数はデフォルトの定数(crDefaultなど)と重ならないように定義する。カーソル定数はTCursor型で-32768から32367までの整数であり、BDS2006では-22から0までがデフォルトの定数に使用されている。

注意:カーソルを使い終わってもDestroyCursorを呼び出してはいけない。勝手に開放される。

----------------
3.使いたいことろで、

Image1->Cursor=crMyCursor1;

のように使う。

----------------

|

[BCB] スクリーンセーバが起動しないようにする

WM_SYSCOMMAND の wParamがSC_SCREENSAVE のとき1を返せばスクリーンセーバの起動を抑制できるようです。

ヘッダ

private:
  void __fastcall WMSysCommand(TMessage &Msg);

  BEGIN_MESSAGE_MAP
    //捕まえたいメッセージと、それを処理する関数を登録
    VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand)
  END_MESSAGE_MAP(TComponent)

ソース

//---------------------------------------------------------------------------
//スクリーンセーバの起動を抑制
void __fastcall TForm1::WMSysCommand(TMessage &Msg)
{
  if (Msg.WParam==SC_SCREENSAVE) {
    Msg.Result=1;
  } else {
    Msg.Result=DefWindowProc(Handle,Msg.Msg,Msg.WParam,Msg.LParam);
  }
}

|

[BCB] 文字列に含まれる環境変数を展開する

文字列に含まれる%SystemRoot%のような環境変数を展開する方法です。

ExpandEnvironmentString関数を使います。

  char ExpandName[MAX_PATH];
  ExpandEnvironmentStrings("%SystemRoot%\temp",ExpandName,sizeof(ExpandName));

|

[BCB] システムフォルダを取得する

デスクトップやマイドキュメントなどの特殊フォルダの位置を取得する方法です。
以下はデスクトップの位置を取得する例です。

#include <shlobj.h>


  TCHAR szPath[_MAX_PATH];
  LPITEMIDLIST pidl;

  IMalloc *pMalloc;
  SHGetMalloc(&pMalloc);

  if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl))) {
    SHGetPathFromIDList(pidl,szPath);
    pMalloc->Free(pidl);             
  }
  pMalloc->Release();

|

[BCB] 現在のOSの言語名を取得する

  char *LangName=NULL;

  LCID id=GetUserDefaultLCID();
  int Len=GetLocaleInfo(id,LOCALE_SENGLANGUAGE,NULL,0);
  if (Len>0) {
    LangName=new char[Len+1];
    ZeroMemory(LangName,Len+1);
    GetLocaleInfo(id,LOCALE_SENGLANGUAGE,LangName,Len+1);
  }

LOCALE_SENGLANGUAGEの部分を変えれば、国名(LOCALE_SENGCOUNTRY)や通貨名(LOCALE_SENGCURRNAME)、日付時刻の区切り文字(LOCALE_SDATE、LOCALE_STIME)などの各種ロケール情報を取得できます。

|

[BCB] OSの言語を判定

LCID LocaleID=GetUserDefaultLCID();

switch (LocaleID) {
case 1025: //Arabic (Saudi Arabia)
case 2049: //Arabic (Iraq)
case 3073: //Arabic (Egypt)
case 4097: //Arabic (Libya)
case 5121: //Arabic (Algeria)
case 6145: //Arabic (Morocco)
case 7169: //Arabic (Tunisia)
case 8193: //Arabic (Oman)
case 9217: //Arabic (Yemen)
case 10241: //Arabic (Syria)
case 11265: //Arabic (Jordan)
case 12289: //Arabic (Lebanon)
case 13313: //Arabic (Kuwait)
case 14337: //Arabic (U.A.E.)
case 15361: //Arabic (Bahrain)
case 16385: //Arabic (Qatar)
case 1026: //Bulgarian
case 1027: //Catalan
case 1028: //Chinese (Taiwan)
case 2052: //Chinese (PRC)
case 3076: //Chinese (Hong Kong)
case 4100: //Chinese (Singapore)
case 1029: //Czech
case 1030: //Danish
case 1031: //German (Standard)
case 2055: //German (Swiss)
case 3079: //German (Austrian)
case 4103: //German (Luxembourg)
case 5127: //German (Liechtenstein)
case 1032: //Greek
case 1033: //English (United States)
case 2057: //English (United Kingdom)
case 3081: //English (Australian)
case 4105: //English (Canadian)
case 5129: //English (New Zealand)
case 6153: //English (Ireland)
case 7177: //English (South Africa)
case 8201: //English (Jamaica)
case 9225: //English (Caribbean)
case 10249: //English (Belize)
case 11273: //English (Trinidad)
case 1034: //Spanish (Traditional Sort)
case 2058: //Spanish (Mexican)
case 3082: //Spanish (Modern Sort)
case 4106: //Spanish (Guatemala)
case 5130: //Spanish (Costa Rica)
case 6154: //Spanish (Panama)
case 7178: //Spanish (Dominican Republic)
case 8202: //Spanish (Venezuela)
case 9226: //Spanish (Colombia)
case 10250: //Spanish (Peru)
case 11274: //Spanish (Argentina)
case 12298: //Spanish (Ecuador)
case 13322: //Spanish (Chile)
case 14346: //Spanish (Uruguay)
case 15370: //Spanish (Paraguay)
case 16394: //Spanish (Bolivia)
case 17418: //Spanish (El Salvador)
case 18442: //Spanish (Honduras)
case 19466: //Spanish (Nicaragua)
case 20490: //Spanish (Puerto Rico)
case 1035: //Finnish
case 1036: //French (Standard)
case 2060: //French (Belgian)
case 3084: //French (Canadian)
case 4108: //French (Swiss)
case 5132: //French (Luxembourg)
case 1037: //Hebrew
case 1038: //Hungarian
case 1039: //Icelandic
case 1040: //Italian (Standard)
case 2064: //Italian (Swiss)
case 1041: //Japanese
case 1042: //Korean
case 2066: //Korean (Johab)
case 1043: //Dutch (Standard)
case 2067: //Dutch (Belgian)
case 1044: //Norwegian (Bokmal)
case 2068: //Norwegian (Nynorsk)
case 1045: //Polish
case 1046: //Portuguese (Brazil)
case 2070: //Portuguese (Portugal)
case 1048: //Romanian
case 1049: //Russian
case 1050: //Croatian
case 2074: //Serbian (Latin)
case 3098: //Serbian (Cyrillic)
case 1051: //Slovak
case 1052: //Albanian
case 1053: //Swedish
case 2077: //Swedish (Finland)
case 1054: //Thai
case 1055: //Turkish
case 1057: //Indonesian
case 1058: //Ukrainian
case 1059: //Belarusian
case 1060: //Slovenian
case 1061: //Estonian
case 1062: //Latvian
case 1063: //Lithuanian
case 1065: //Farsi
case 1066: //Vietnamese
case 1069: //Basque
case :1078 //Afrikaans
case 1080: //Faeroese
}

|

[BCB] プロセスを列挙する

#include <Tlhelp32.h>

void EnumProcesses()
{
  //プロセスの列挙   
  HANDLE hSnapShot;
   PROCESSENTRY32 procEntry;

   //システムのスナップショットを取得
   hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
   procEntry.dwSize =sizeof(procEntry);
   if (Process32First (hSnapShot,&procEntry)!=NULL) {
    do {
       ListBox1->Items->Add(procEntry.szExeFile);
     } while (Process32Next (hSnapShot,&procEntry));
   }
   CloseHandle(hSnapShot);
}

|

アイコン・カーソル リソースについて

グループアイコン(RT_GROUP_ICON)やグループカーソル(RT_GROUP_CURSOR)のデータ構造に関する情報です。

まず最初に全体のヘッダ情報。

struct NEWHEADER {
  WORD Reserved;
  WORD ResType;
  WORD ResCount;
} NEWHEADER, *PNEWHEADER;
NEWHEADER NewHeader;

ResTypeにはアイコンならRES_ICON、カーソルならRES_CURSOR。
ResCountには入っているリソースの個数。

ヘッダに続いて以下のデータがリソースの個数だけ続く。

typedef struct tagRESDIR {
  union {
  ICONRESDIR   Icon;
  CURSORDIR    Cursor;
  } ResInfo;
  WORD    Planes;
  WORD    BitCount;
  DWORD   BytesInRes;
  WORD  IconCursorId;
} RESDIR;

Planesはカラープレーン数。
BitCountは1ピクセルあたりのビット数。
BytesInResはリソースのサイズ。
IconCursorIdはリソースのID。

struct ICONRESDIR {
  BYTE Width;
  BYTE Height;
  BYTE ColorCount;
  BYTE reserved;
} ICONRESDIR;

Widthはアイコンの幅。
Heightはアイコンの高さ。
ColorCountは色数。255色以上の場合は0が入る。

struct CURSORDIR {
  WORD Width;
  WORD Height;
} CURSORDIR;

Widthはカーソルの幅。
Heightはカーソルの高さ。

|

[Delphi/BCB] manifestファイルをexeに埋め込む

manifestファイルの書き方はこちらを参照してください。

作成したmanifestファイルをexeファイルにリソースとして埋め込む方法です。

#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define CONTROL_PANEL_RESOURCE_ID 123
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "○○.exe.manifest"

これをmanifest.rcというようなファイル名で保存します。なお上記の○○の部分には実行ファイルの名前を書きます。「プロジェクト」-「プロジェクトに追加」で作成したrcファイルをプロジェクトに追加します。

これでコンパイルすればOKです。

|

[BCB] セーフモードが通常モードかを判定する

switch (GetSystemMetrics(SM_CLEANBOOT)) {
case 0:
  //通常どおり起動された
  break;
case 1:
  //「Safeモード」で起動された
  break;
case 2:
  //「ネットワークを使ったSafeモード」で起動された
  break;
}

|

[BCB] Windowsのシステムディレクトリを取得

「C:\Windows」のようなWindowsディレクトリを取得するには次のようにします。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char Buf[MAX_PATH];
  GetWindowsDirectory(Buf,MAX_PATH);

   Label1->Caption=Buf;
}


同じように「C:\Windows\System32」のようなシステムディレクトリはGetSystemDirectoryで取得することができます。

|

[BCB] 時間を計測する

・GetTickCount
 コンピュータが起動してからの経過時間をミリ秒で返す。精度はいまいちで5~10ms程度。

・timeGetTime
 コンピュータが起動してからの経過時間をミリ秒で返す。

・QueryPerformanceCounter(LARGE_INTEGER *)
 高分解能パフォーマンスカウンタの値が取得できる。取得した値はQueryPerformanceFrequencyで得られるカウンタの周波数から、時間に変換できる。

  LONGLONG t1,t2,fr;

  QueryPerformanceFrequency((LARGE_INTEGER *)&fr);
  QueryPerformanceCounter((LARGE_INTEGER *)&t1);

  //計測したい処理

  QueryPerformanceCounter((LARGE_INTEGER *)&t2);
  Label1->Caption=AnsiString().sprintf("%.1f us", (double)(t2-t1) / fr * 1000000);

|

[BCB] アプリの2重起動を禁止する

Mutexを使用して、アプリケーションの2重起動を禁止する方法です。「プロジェクト」-「ソース表示」で表示されるファイルに以下のようなコードを追記します。

=====

#define MUTEX_ID "Unique_ID_String"  //適当な文字列を設定

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {

    HANDLE  hMutex=NULL;

    //2重起動のチェック

    //Mutexを作成してみる
    hMutex = CreateMutex(NULL, true, MUTEX_ID);
    if (hMutex!=NULL) {
      if (GetLastError()==ERROR_ALREADY_EXISTS) { //すでに起動されている
        CloseHandle(hMutex); // 閉じる
        ReleaseMutex(hMutex);// 破棄する

        //すでに起動済みの画面を探して前面に持ってくる処理などを書く

        return 0; //終了
      }
    } else {
      //Mutexの作成に失敗したときの処理
    }

    //この辺はもともと書かれている部分
    Application->Initialize();
       :
    Application->Run();

    //最後に後始末
    CloseHandle(hMutex); // 閉じる
    ReleaseMutex(hMutex); //ミューテクス解除
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
       :
  return 0;
}

| | コメント (0)

[BCB] Windowsのメッセージを処理する

BCBでWindowsのメッセージを捕まえて処理をする場合の書き方です。

class TForm1 : public TForm
{
    :

private:
    //実際にメッセージを処理する関数の宣言
    //関数の中身はソースに自分で書く
    void __fastcall WMDropFile(TWMDropFiles &Msg);


BEGIN_MESSAGE_MAP
    //捕まえたいメッセージと、それを処理する関数を登録
    VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFile)
END_MESSAGE_MAP(TComponent)

};

| | コメント (0)

[BCB] デスクトップ作業領域の矩形を取得

TRect WorkAreaRect;

SystemParametersInfo( SPI_GETWORKAREA, 0, &WorkAreaRect, 0 );

| | コメント (0)

[Delphi/BCB] manifestファイルの書き方

manifestファイルを使うと、アプリケーションの外観を簡単にWindowsXPのスタイルにすることができます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
  version="1.0.0.0"
  processorArchitecture="X86"
  name="CompanyName.ProductName.YourApp"
  type="win32" />
<description>Description</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*" />
    </dependentAssembly>
</dependency>
</assembly>

これを、○○.exe.manifestという名前のファイルに保存します。このとき文字コードはUTF-8にします。○○の部分は実行ファイルの名前を入れます。このファイルを実行ファイルと同じ場所においておけばOKです。

Delphi5の場合は、PageControlなど一部のコンポーネントは、うまくスタイルが変更されません。これらに対応したコンポーネントを作られている方もいるようです。

| | コメント (0)

[BCB] HTML Helpを扱う

マイクロソフトのホームページからダウンロードできるHTML Help WorkshopにはプログラムからHTML Helpを扱うためのライブラリファイル(htmlhelp.lib)が付属していますが、BCBではそのまま使うことはできません。次のようにしてhhctrl.ocxからBCB用のライブラリファイルを作成します。

implib htmlhelp.lib hhctrl.ocx

BCBのプロジェクトに、作成したhtmlhelp.libと、Workshopに付属しているヘッダファイルhtmlhelp.hを追加します。

FormのOnCreateとOnCloseに下記のようなコードを書きます。

//

| | コメント (0)

[BCB] タスクバーに表示されないアプリを作る

プロジェクトのソースファイルを以下のように書き換えます。ソースファイルは「プロジェクト」-「ソース表示」で表示できます。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
    Application->Initialize();
    //タスクバーからアイコンを消す
    ShowWindow(Application->Handle, SW_HIDE);
    SetWindowLong(Application->Handle, GWL_EXSTYLE,
      GetWindowLong(Application->Handle, GWL_EXSTYLE) | WS_EX_TOOLWINDOW);
    Application->CreateForm(__classid(TForm1), &Form1);
    Application->Run();
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
  }
       :

| | コメント (0)

[Delphi] 電源(バッテリ)の状態を取得する

GetSystemPowerStatus関数を使います。この関数はWindows NTでは使用できません。

procedure TForm1.Button1Click(Sender: TObject);
var
 SystemPowerStatus: TSystemPowerStatus;
begin
 GetSystemPowerStatus(SystemPowerStatus);
end;

関数を実行するとTSystemPowerStatus構造体に結果が格納されます。構造体のメンバは以下のとおりです。

ACLineStatusAC電源の状態
BatteryFlagバッテリの充電状態
BatteryLifePercentバッテリの残り(%)
Reserved1未使用(常に0)
BatteryLifeTimeバッテリの残り時間(秒)
BatteryFullLifeTimeフル充電状態での残り時間(秒)

値の意味は以下のとおりです。

ACLineStatus

0オフライン
1オンライン
255不明

BatteryFlag

1残り66%以上
2残り33%以下
4残り5%以下
8充電中
128バッテリはない
255不明

| | コメント (0)

[BCB] OSの名前を取得する(簡易版)

ヘッダ

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Windows.hpp>

class TSysOSVersionInfo
{
private:
 AnsiString FProductID;
 AnsiString FProductName;
 DWORD FServicePackVersion;
 DWORD FVersionMajor;
 DWORD FVersionMinor;
 DWORD FVersionBuild;
 AnsiString FCSDVersion;

 bool FIsWinNT;
public:
 __fastcall TSysOSVersionInfo(void);
 __fastcall ~TSysOSVersionInfo(void);

 __property AnsiString ProductID={read=FProductID};
 __property AnsiString ProductName={read=FProductName};
 __property AnsiString ProductType={read=FProductType};
 __property DWORD ServicePackVersion={read=FServicePackVersion};
 __property DWORD VersionMajor={read=FVersionMajor};
 __property DWORD VersionMinor={read=FVersionMinor};
 __property DWORD VersionBuild={read=FVersionBuild};
 __property AnsiString CSDVersion={read=FCSDVersion};
};


#endif

ソース

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


#pragma hdrstop

#include "Unit1.h"

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

#pragma package(smart_init)

#include <windows.h>
#include <Registry.hpp>

//---------------------------------------------------------------------------
__fastcall TSysOSVersionInfo::TSysOSVersionInfo(void)
{
 TSystemInfo SystemInfo;

 memset(&SystemInfo, 0x00, sizeof(SystemInfo));
 GetSystemInfo(&SystemInfo);

 FIsWinNT = (Win32Platform == VER_PLATFORM_WIN32_NT);

 //ProductID,ProductName
 TRegistry *Reg=new TRegistry(KEY_READ);
 try {
  bool Res;
  Reg->RootKey=HKEY_LOCAL_MACHINE;
  if (FIsWinNT) Res=Reg->OpenKeyReadOnly("Software\\Microsoft\\Windows NT\\CurrentVersion");
  else Res=Reg->OpenKeyReadOnly("Software\\Microsoft\\Windows\\CurrentVersion");

  if (Res) {
   FProductID=Reg->ReadString("ProductID");
   FProductName=Reg->ReadString("ProductName");
  }

  Reg->CloseKey();
 } __finally {
  delete Reg;
 }
 FVersionMajor=Win32MajorVersion;
 FVersionMinor=Win32MinorVersion;
 FVersionBuild=Win32BuildNumber;
 FCSDVersion=Win32CSDVersion;
}
//---------------------------------------------------------------------------
__fastcall TSysOSVersionInfo::~TSysOSVersionInfo(void)
{

}
//---------------------------------------------------------------------------

| | コメント (0)

[BCB] システムの音を鳴らす

MessageBeepを使うと、コントロールパネルの[サウンド]で設定された音を鳴らすことができます。引数には音の種類を指定します。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MessageBeep(MB_ICONASTERISK);
}

指定できる音の種類

0xFFFFFFFF標準のビープ音
MB_ICONASTERISKシステム 情報
MB_ICONEXCLAMATIONシステム 警告
MB_ICONHANDシステム エラー
MB_ICONQUESTIONシステム 問い合わせ
MB_OKデフォルトの警告音

| | コメント (0)

[Delphi] 画面のサイズを取得する

画面のサイズを取得するにはTScreenのプロパティを使います。

W:=Screen.Width; //画面の幅
H:=Screen.Height; //画面の高

|

[BCB] ShellExecuteの使い方

関連付けられたアプリで開く
ShellExecute(NULL, "open", Filename.c_str(), NULL, NULL, SW_SHOWNORMAL);

 *openのほかにもprintとかも使える

アプリを指定して開く
ShellExecute(NULL, NULL, "notepad.exe", Filename.c_str(), NULL, SW_SHOWNORMAL);

| | コメント (0)

[Delphi] 仮想キーコードで英数字を扱うには

Ord関数を使います。

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if Key=Ord('K') then begin
  //Kが押されたときの処理
 end;
end;

| | コメント (0)

[Delphi] 仮想キーコード

VK_LBUTTONVK_RBUTTONVK_CANCEL
VK_MBUTTONVK_BACKVK_TAB
VK_CLEARVK_RETURNVK_SHIFT
VK_CONTROLCtrlVK_MENUAltVK_PAUSE
VK_CAPITALVK_KANAVK_HANGUL
VK_JUNJAVK_FINALVK_HANJA
VK_KANJIVK_CONVERTVK_NONCONVERT
VK_ACCEPTVK_MODECHANGEVK_ESCAPE
VK_SPACEVK_PRIORVK_NEXT
VK_ENDVK_HOMEVK_LEFT
VK_UPVK_RIGHTVK_DOWN
VK_SELECTVK_PRINTVK_EXECUTE
VK_SNAPSHOTVK_INSERTVK_DELETE
VK_HELP'0'($30) ~ '9'($39)'A'($41) ~ 'Z'($5A)
VK_LWINVK_RWINVK_APPS
VK_NUMPAD0~VK_NUMPAD9VK_MULTIPLYVK_ADD
VK_SEPARATORVK_SUBTRACTVK_DECIMAL
VK_DIVIDEVK_F1~VK_F24VK_NUMLOCK
VK_SCROLLVK_PROCESSKEYVK_ATTN
VK_CRSELVK_EXSELVK_EREOF
VK_PLAYVK_ZOOMVK_NONAME
VK_PA1VK_OEM_CLEAR 

以下はGetAsyncKeyState() と GetKeyState()で使用するためのキーコード。右と左が区別できる。

VK_LSHIFTVK_RSHIFT
VK_LCONTROLVK_RCONTROL
VK_LMENUVK_RMENU

| | コメント (0)

[Delphi] 起動引数を取得する

起動引数をListBoxに一覧表示する例です。

var
 i:Integer;
begin
 for i:=1 to ParamCount do begin
  ListBox1.Items.Add(ParamStr(i));
 end;
end;

ParamCountは引数の数で、ParamStr(i) で実際の引数が取得できます。ParamStr(0) はアプリケーション自身のファイル名で、ParamStr(1) が1つ目の引数になります。

| | コメント (0)

[Delphi] コントロールパネルを表示する

コントロールパネルを表示するには以下のようにします。

WinExec('control.exe', SW_SHOW);

さらに、コントロールパネル内の「マウスのプロパティ」を表示したいときは、

WinExec('control.exe main.cpl',SW_SHOW);

とします。 ほかにもmain.cplの部分を書き換えることでいろいろな設定ダイアログが表示できます。

WindowsXPの例

access.cplユーザ補助のオプション
appwiz.cplプログラムの追加と削除
bthprops.cplBluetooth
desk.cpl画面のプロパティ
firewall.cplWindowsファイアウォール
hdwwiz.cplハードウェアの追加ウィザード
inetcpl.cplインターネットのプロパティ
irprops.cplワイヤレスリンク
joy.cplゲームコントローラ
main.cplマウスのプロパティ
mmsys.cplサウンドとオーディオデバイスのプロパティ
netsetup.cplネットワークセットアップウィザード
nusrmgr.cplユーザアカウント
powercfg.cpl電源オプションのプロパティ
sysdm.cplシステムのプロパティ
telephon.cpl電話とモデムのオプション
timedate.cpl日付と時刻のプロパティ
wscui.cplWindowsセキュリティセンター
wuaucpl.cpl自動更新

| | コメント (0)

[BCB] シャットダウンダイアログを表示する

タスクバーを閉じるとシャットダウンのダイアログが表示されます。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 HWND hWnd;

 hWnd=FindWindow("Shell_TrayWnd", NULL); //タスクバーのハンドルを取得
 SendMessage(hWnd, WM_CLOSE, 0, 0);
}

| | コメント (0)

[Delphi] シャットダウンダイアログを表示する

タスクバーを閉じるとシャットダウンのダイアログが表示されます。

provedure TForm1.ShutdownWindows;
var
 h : HWND;
begin
 h := FindWindow('Shell_TrayWnd', nil); //タスクバーのハンドルを取得
 SendMessage(h, WM_CLOSE, 0, 0);
end;

| | コメント (0)

[BCB] ファイルに対応付けられているアイコンを取得する

SHFILEINFO shfi;

SHGetFileInfo(Filename.c_str(), FILE_ATTRIBUTE_ARCHIVE, &shfi,
         sizeof(SHFILEINFO),
         SHGFI_ICON | SHGFI_LARGEICON | SHGFI_TYPENAME);
Image1->Picture->Icon->Handle=shfi.hIcon;

| | コメント (0)

[Delphi] Wavを鳴らす

uses MMSystem;

SndPlaySound('test.wav',SND_ASYNC);

| | コメント (0)

[Delphi] エクスプローラからのDrag & Dropに対応する

type
 TForm1 = class(TForm)
  procedure FormShow(Sender: TObject);
  procedure FormCreate(Sender: TObject);
 private
{ Private 宣言 }
  procedure Nantoka(Filename:String);
  procedure WMDropFiles(var Msg: TWMDropFiles); Message WM_DropFiles;
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
 FileName: Array[0..MAX_PATH] of Char;
begin
 DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
 Nanntoka(String(FileName));
 DragFinish(Msg.Drop);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
 if ParamCount<>0 then Nantoka(ParamStr(1));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 DragAcceptFiles(Form1.Handle, True);
end;

| | コメント (0)

[Delphi] 外部プロセスを起動する

var
HAPP:HWND; //起動したアプリケーションのハンドルを保持する

function EnumWindowsProc(HWND:THandle; lParam:LongInt) : BOOL; stdcall;
var
 dwProcessID:Integer;
begin
 Result:=True;
 if (GetWindow(HWND,GW_OWNER)=0) and IsWindowVisible(HWND) then begin
  GetWindowThreadProcessID(HWND,@dwProcessID);
  if (dwProcessID=lParam) then begin
   HAPP:=HWND;
   Result:=False;
  end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 si:TStartupInfo;
 pi:TProcessInformation;
begin
 GetStartupInfo(si);
 CreateProcess(nil,PChar('Notepad.exe'),nil,nil,False,
    CREATE_DEFAULT_ERROR_MODE,nil,PChar(GetCurrentDir),si,pi);

 WaitForInputIdle(pi.hProcess,INFINITE);

 EnumWindows(@EnumWindowsProc,pi.dwProcessID);
end;

| | コメント (0)

[Delphi] 搭載されているメモリ量を取得

function TForm1.GetAvailableMemory: String;
var
 ms:TMemoryStatus;
begin
 ms.dwLength:=SizeOf(TMemoryStatus);
 GlobalMemoryStatus(ms);
 Result:=IntToStr(ms.dwTotalPhys);
end;

TMemoryStatusには、以下のような値が格納されています。

dwLength構造体のサイズ
dwMemoryLoad利用中のメモリの割合
dwTotalPhys物理メモリのバイト数
dwAvailPhys物理メモリの空きバイト数
dwTotalPageFileページングファイルのバイト数
dwAvailPageFileページングファイルの空きバイト数
dwTotalVirtualアドレス空間のユーザバイト数
dwAvailVirtual空きユーザバイト数

| | コメント (0)

[BCB] バージョン情報の取得

void GetFileVersionInformation(char *Result,int Size)
{
  LPVOID lpStr1 = NULL;
  LPVOID lpStr2 = NULL;
  WORD* wTmp;
  DWORD dwHandle_dammy = NULL;
  UINT nRet;
  UINT dwLength;
  char sFileName[1024];
  char sTmp[1024];
  char *sInfo;

  if ((Result==NULL) || (Size==0)) return;

  memset(sFileName,0x00,1024);
  GetModuleFileName(NULL,sFileName,1024);

  //バージョン情報のサイズを取得する
  DWORD dwInfoSize = GetFileVersionInfoSize((char*)(LPCTSTR)sFileName, &dwHandle_dammy);
  LPVOID* pVersionInfo = new LPVOID[dwInfoSize];

  nRet = GetFileVersionInfo((char*)(LPCTSTR)sFileName, dwHandle_dammy, dwInfoSize, pVersionInfo);
  if(nRet){
    //言語IDとキャラクタIDを取得する
    nRet = VerQueryValue(pVersionInfo, "\\VarFileInfo\\Translation", &lpStr1, &dwLength);
    if(nRet){
      wTmp = (WORD*)lpStr1;

      //バージョン情報を取得する
      StringCbPrintfA(sTmp,1024,"\\StringFileInfo\\%04x%04x\\FileVersion", *wTmp, *(wTmp + 1));
      nRet = VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength);

      if(nRet) sInfo = (char*)lpStr2;
      else sInfo = "";

      strncpy(Result,sInfo,Size-1);
    } else {
      strncpy(Result,"",Size-1);
    }
  } else {
    strncpy(Result,"",Size-1);
  }
  delete[] pVersionInfo;
}


=====
AnsiString 版

AnsiString GetFileVersionInformation(void)
{
  LPVOID lpStr1 = NULL;
  LPVOID lpStr2 = NULL;
  WORD* wTmp;
  DWORD dwHandle_dammy = NULL;
  UINT nRet;
  UINT dwLength;
  AnsiString sTmp;
  AnsiString sInfo;
  AnsiString Result="";

  //バージョン情報のサイズを取得する
  DWORD dwInfoSize = GetFileVersionInfoSize(Application->ExeName.c_str(), &dwHandle_dammy);
  LPVOID* pVersionInfo = new LPVOID[dwInfoSize];

  nRet = GetFileVersionInfo(Application->ExeName.c_str(), dwHandle_dammy, dwInfoSize, pVersionInfo);
  if(nRet){
    //言語IDとキャラクタIDを取得する
    nRet = VerQueryValue(pVersionInfo, "\\VarFileInfo\\Translation", &lpStr1, &dwLength);
    if(nRet){
      wTmp = (WORD*)lpStr1;

      //バージョン情報を取得する
      sTmp.sprintf("\\StringFileInfo\\%04x%04x\\FileVersion", *wTmp, *(wTmp + 1));
      nRet = VerQueryValue(pVersionInfo, sTmp.c_str(), &lpStr2, &dwLength);

      if(nRet) Result = (char*)lpStr2;
      else Result = "-";
    } else {
      Result="-";
    }
  } else {
    Result="-";
  }
  delete[] pVersionInfo;

  return Result;
}

| | コメント (0)