API



APIの呼び方(ASCIZ文字列の作り方)

WindowsAPIに文字列をセットする場合はASCIZ文字列になります。しかし、PASCALではASCIZ文字列をサポートしていません。しかし、キャストを上手く利用すれば、簡単にできます。

[C++Builder]
AnsiString型をASCIZに変換するには、TAnsiStringクラスのc_str()メソッドを使うのが簡単です。

void *fnMappingCreate(AnsiString sMappedName,long lSize,HANDLE *hFile, HANDLE *hFileMapping)
{
    void *result = NULL;
    // 名前なしファイルのオープン
    *hFile = CreateFile( NULL, 
                         GENERIC_READ | GENERIC_WRITE,
                         FILE_SHARE_READ,
                         NULL,
                         CREATE_NEW,
                         FILE_FLAG_SEQUENTIAL_SCAN,
                         NULL    );
    // ファイルをメモリーマップドファイルにする
    *hFileMapping = CreateFileMapping( *hFile,
                                       NULL,                 // Security attributes
                                       PAGE_READWRITE,       // Protection
                                       0,                    // Size - high 32 bits
                                       lSize,                // Size - low 32 bits
                                       sMappedName.c_str() );
    if (*hFileMapping == NULL) {
        Application->MessageBox( "メモリの確保に失敗しました[1]",
                                 "警告",
                                 MB_ICONEXCLAMATION | IDYES );
        ExitProcess(0);         // プロセスを終了する
    }
    // ファイルをメモリー上にマップする
    result = MapViewOfFile( *hFileMapping,           // File mapping object
                            FILE_MAP_ALL_ACCESS,     // Read/Write
                            0,                       // Offset - high 32 bits
                            0,                       // Offset - low 32 bits
                            0 );                     // Map the whole thing
    if (result == NULL) {
        Application->MessageBox( "メモリの確保に失敗しました[2]",
                                 "警告",
                                 MB_ICONEXCLAMATION | IDYES );
                                 ExitProcess(0);     // プロセスを終了する
    }
    return result;
}


[Delphi]
pCharでキャストすれば、String型をASCIZ文字列に変換出来ます。

function  fnMappingCreate(string  sMappedName, integer iSize,var hFileMapping: integer): pointer;
var
    dlg: TForm;
begin
    hFileMapping := CreateFileMapping( $ffffffff,            // FileHandle
                                       Nil,                  // Security attributes
                                       PAGE_READWRITE,       // Protection
                                       0,                    // Size - high 32 bits
                                       iSize,                // Size - low 32 bits
                                       pChar(sMappedName) ); // Name
    if hFileMapping < 0 then begin
        dlg := CreateMessageDialog('メモリの確保に失敗しました[1]','警告',mtError,[mbYes]);
        dlg.ActiveControl := TWinControl(dlg.FindComponent('Yes'));
        dlg.ShowModal;
        dlg.Free;
        ExitProcess(0);         // プロセスを終了する
    end;
    result := MapViewOfFile( hFileMapping,           // File mapping object
                             FILE_MAP_ALL_ACCESS,    // Read/Write
                             0,                      // Offset - high 32 bits
                             0,                      // Offset - low 32 bits
                             0 );                    // Map the whole thing
end;






電源OFF(WinNT)

NTカーネルで電源をOFFする方法です。

[C++Builder]

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HANDLE  hToken;
    LUID    takeOwnershipValue;
    TOKEN_PRIVILEGES        tkp;
    if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
        ShowMessage("OpenProcessToken() failed");
        return;
    }
    if (!LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &takeOwnershipValue)) {
        ShowMessage("LookupPrivilegeValue() failed");
        return;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = takeOwnershipValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, false, &tkp, sizeof(TOKEN_PRIVILEGES), 0, 0);
    if (GetLastError()) {
        ShowMessage("AdjustTokenPrivileges() failed");
        return;
    }
//  ExitWindowsEx(EWX_LOGOFF,0);                    // ログオフ
    ExitWindowsEx((EWX_SHUTDOWN | EWX_POWEROFF),0); // シャットダウンと電源OFF
//  ExitWindowsEx(EWX_REBOOT,0);                    // 再起動
//  ExitWindowsEx(EWX_SHUTDOWN,0);                  // シャットダウン
}


[Delphi]

procedure TForm1.Button1Click(Sender: TObject);
var
    hToken,ReturnLength     : integer          ;
    NewState,PreviousState  : Ttokenprivileges ;
begin
    OpenprocessToken(GetCurrentProcess(),(TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY),hToken) ;
    LookupPrivilegeValue(pchar(#0),pchar('SeShutdownPrivilege'),NewState.Privileges[0].Luid) ;
    NewState.PrivilegeCount := 1 ;
    NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED ;
    AdjustTokenPrivileges(hToken,false,NewState,16,PreviousState,ReturnLength) ;
//  ExitWindowsEx(EWX_LOGOFF,0);                    // ログオフ
    ExitWindowsEx((EWX_SHUTDOWN | EWX_POWEROFF),0); // シャットダウンと電源OFF
//  ExitWindowsEx(EWX_REBOOT,0);                    // 再起動
//  ExitWindowsEx(EWX_SHUTDOWN,0);                  // シャットダウン
end;






特定のメッセージに対するイベントハンドラを作成する

ボタンダブルクリックなどのイベントハンドラはC++Builderが作成してくれますが、「ウィンドウが動いた」時のイベントハンドラなどはそうはいかないので、自分で作る必要があります。
[例]Windows終了クエリー・イベントハンドラを作成します。ユーザーがWindowsを終了しようとしたときに、Windowsは各アプリケーションに本当に終了して良いかどうか尋ねるメッセージを発行しますが、そのメッセージをキャッチします。

[unit1.h]
class TForm1 : public TForm
{
__published:    // IDE 管理のコンポーネント
private:        // ユーザー宣言
    void __fastcall WMQueryEndSession(TWMQueryEndSession &WMQES);   //これがイベントハンドラになる

    //このメッセージマップで、キャッチしたいメッセージ・引数の型・イベントハンドラ名を指定
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_QUERYENDSESSION,TWMQueryEndSession,WMQueryEndSession)
    END_MESSAGE_MAP(TForm)
};

[unip1.cpp]
void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES)
{
// ここにWindows終了直前にやりたいことを書く
// 最後に、Windowsが終了してもいいかを指定
    WMQES.Result = TRUE;    //Windowsに「終了してもいいよ」と伝える
    WMQES.Result = FALSE;   //Windowsの終了を禁止する
}






フォームのどこをクリックしても移動できるようにするには

次のコードを付け加えます。

[unit1.h]
protected:
    void __fastcall WMLButtonDown(TWMLButtonDown &Msg);
public:
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_LBUTTONDOWN,TWMLButtonDown,WMLButtonDown)
END_MESSAGE_MAP(TForm)

[unit1.cpp]
void __fastcall TForm1::WMLButtonDown(TWMLButtonDown &Msg)
{
    SendMessage(Handle,WM_SYSCOMMAND,SC_MOVE | 2, 0);
}






タスクバーの表示を消すには


ShowWindow(Application->Handle,SW_HIDE);
をApplication->Initialize();の次あたりに書きます。

再び表示するには
ShowWindow(Application->Handle,SW_SHOW);
とします。






メインフォームを非表示にするには


実行開始時から表示しない場合は
Application->ShowMainForm= false;
をApplication->CreateForm(__classid(TForm1), &Form1);の前に書きます。

途中で非表示にするには
Hide();

再び表示するには
Show();

とします。






タイトルバーがクリックされたとき処理をするには

次のコードを書き加えます。

[unit1.h]
protected:
    void __fastcall WMNCLButtonDown(TWMNCLButtonDown &msg);
public:
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_NCLBUTTODOWN,TWMNCLButtonDown,WMNCLButtonDown)
END_MESSAGE_MAP(TForm)

[unit1.cpp]
void __fastcall TForm1::WMNCLButtonDown(TWMNCLButtonDown &msg)
{
    TForm::Dispatch(&msg);
    if (msg.HitTest==HTCAPTION) {
        // ここに処理を書き込みます
    }
}

ダブルクリックを検出するにはDownの部分をすべてDblClkにかえればOKです。
※NCLButtonDown->Not Client Left Botton Downと考えれば応用がききます。






ウインドウのサイズ変更を制限するには

次のコードを書き加えます。

[unit1.h]
protected:
    void __fastcall WMGetMinMaxInfo(TWMGetMinMaxInfo &msg);
public:
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_GETMINMAXINFO,TWMGetMinMaxInfo,WMGetMinMaxInfo)
END_MESSAGE_MAP(TForm)

[unit1.cpp]
void __fastcall TForm1::WMGetMinMaxInfo(TWMGetMinMaxInfo &msg)
{
    msg.MinMaxInfo->ptMinTrackSize.x= 320;        //最小サイズ
    msg.MinMaxInfo->ptMinTrackSize.y= 200;
    msg.MinMaxInfo->ptMaxTrackSize.x= 680;        //最大サイズ
    msg.MinMaxInfo->ptMaxTrackSize.y= 400;
    msg.MinMaxInfo->ptMaxSize.x= 680;             //最大化したときのサイズ
    msg.MinMaxInfo->ptMaxSize.y= 400;
}






ファイルをフォームへドラッグアンドドロップできるようにするには

次のコードを書き加えます。

[unit1.h]
protected:
    void __fastcall WMDropFiles(TWMDropFiles &msg);
public:
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
END_MESSAGE_MAP(TForm)

[unit1.cpp]
#include <ShellAPI.h> //DragQueryFile,DragFinish,DragAcceptFilesを使う

void __fastcall TForm1::WMDropFiles(TWMDropFiles &msg)
{
    int n=DragQueryFile((HDROP)msg.Drop, -1, NULL, MAX_PATH); //ドラッグされたファイルの数
    char fileName[MAX_PATH]; //ドラッグされたファイル名
    for (int i=0 ; i<n ; i++) {
        DragQueryFile((HDROP)msg.Drop, i, file_name, MAX_PATH);          //ドラッグされたファイル名を得る
        // ここに処理を書き込みます
    }
    DragFinish((HDROP)msg.Drop);
}
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    DragAcceptFiles(Handle,true);    //ドラッグアンドドロップの許可
}






現在のマウスカーソルの位置を得るには

GetCursorPos(POINT変数)というAPIを使います。

得られる座標はスクリーン座標なのでウインドウ内の座標にしたい場合は
POINT p;
GetCursorPos(&p);
ScreenToClient(p); //ウインドウ内の座標にする
のようにします。

ウインドウ外にマウスカーソルがある場合でも位置を得たい場合は
SetCapture(Handle);
POINT p;
GetCursorPos(&p);
ReleaseCapture();
とします。






マウスカーソルを移動させるには

SetCursorPos(X座標,Y座標)というAPIを使います。
次の例はマウスカーソルの位置を常にタイトルバーに表示して、画面の端にカーソルを持っていったときウインドウ内の左上の位置にカーソルを移動させるものです。

[unit1.h]
private:        // ユーザー宣言
    void __fastcall AppIdle(TObject*,bool &Done);

[unit1.cpp]
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
    Application->OnIdle= AppIdle;
}
void __fastcall TForm1::AppIdle(TObject*,bool &Done)
{
    SetCapture(Handle);    //カーソル座標を得る
    POINT p;
    GetCursorPos(&p);
//  Caption = "("+IntToStr(p.x)+","+IntToStr(p.y)+")";    // debug
//  ReleaseCapture();      // debug
    if ((p.x <= 0) || (p.y <= 0) ||
        (p.x+1 >= Screen->Width) ||
        (p.y+1 >= Screen->Height)) { // 画面端にきたとき
        POINT q = ClientOrigin;      //カーソルの移動先
        for (int i=0,j=10 ; i<j ; i++) {   //少しずつ移動させる
            POINT s;
            s.x = (q.x-p.x)*i/j;
            s.y = (q.y-p.y)*i/j;
            SetCursorPos(p.x+s.x,p.y+s.y);
            DWORD t=GetTickCount()+10;     // 10ミリ秒ウエイト
            while (GetTickCount() < t)
                Application->ProcessMessages();
        }
        SetCursorPos(q.x,q.y);
    }
    Done= false;    // 連続してこの関数を呼ぶ
}






マウスカーソルの移動範囲を制限するには

マウスカーソルの移動範囲を制限するには、ClipCursorというWindowsAPIを使用します。 フォーム内だけに移動範囲を限定したい時は、GetWindowRectというWindowsAPIを使用してフォームの座標を取り出し、左上隅と右下隅の座標を定義します。

  RECT rect;
  GetWindowRect(Handle, &rect);
  ClipCursor(&rect);

※ClipCursorで設定したマウスカーソルの移動範囲の制限はプログラムが終了しても有効ですので、必ず、「ClipCursor(NULL);」で制限を解除するようにしてください。







ウインドウを点滅させるには

FlashWindow(ウインドウハンドル, 点滅させるかどうか)というAPIを使います。
次のようにすればn回点滅します。

int n=3;
for (n+=n ; n-- ; ) {
    FlashWindow(Handle,true);
    DWORD t = GetTickCount()+100;        //0.1秒間隔
    while (GetTickCount()<t)
        Application->ProcessMessages();
}

※点滅させながら処理を行いたい場合はTimerコンポーネントを使って下さい。






タイトルバーを点滅させる

タイトルバーを点滅させたい時はFlashWindowというAPIをつかいます。使用方法は次の通りです。

FlashWindow(Handle, true);

第2パラメータにtrueを指定すると、ウインドウをアクティブ状態、非アクティブ状態とで切り替えます。要するに、そのウインドウで作業をしていない状態と作業をしている状態とを切り替えてる事になります。
でも実際はアクティブ状態が変わるのではなく、表示が変わっているだけです。そしてこれをTimerコンポーネントのOnTimerイベントハンドラに記述しておけば、点滅して見えるわけです。

点滅を終えて元通りにしたい場合は、第2パラメータを true から false として実行します。ようするに

FlashWindow(Handle, false);

とします。






他のアプリケーションを実行するには

プログラムの中から他のアプリケーションを実行するには、ShellExecuteというWindowsAPIを使用します。
ShellExecute(Application->Handle,"open","c:\\windows\\calc.exe",NULL,NULL,SW_SHOW);

このAPIを使用するためにはShellAPI.hをインクルードします。






二重起動を防止するには

二重起動を防止するには、システムリソースのミューテックス オブジェクトを利用して起動時の制限を行います。
ミューテックス オブジェクトを利用するにはOpenMutex、CreateMutex、ReleaseMutexというWindowsAPIを使用します。プロジェクトソースを下記のように変更します。

[C++Builder]
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "Sample");
    if ( hMutex != 0 ) {
        CloseHandle(hMutex);
        return 1;
    } else hMutex = CreateMutex(NULL, true, "Sample");
    try {
        Application->Initialize();
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
    } catch (Exception &exception) {
        Application->ShowException(&exception);
    }
    ReleaseMutex(hMutex);
    return 0;
}

[Delphi]
program Project1;

uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}
var
  hMutex: THANDLE;
begin
  hMutex := OpenMutex(MUTEX_ALL_ACCESS, false, 'Sample');
  if hMutex <> 0 then begin
      CloseHandle(hMutex);
      Exit;
    end;
  hMutex := CreateMutex(Nil, true, 'Sample');
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  ReleaseMutex(hMutex);
end.






タスクバーから消す・表示

消す時は、
ShowWindow( Application->Handle, SW_HIDE );

表示する時は
ShowWindow( Application->Handle, SW_SHOW );






Form ごとにタスクバーに表示

FormCreateなどで
SetWindowLong( Handle, GWL_EXSTYLE , GetWindowLong(Handle, GWL_EXSTYLE)|WS_EX_APPWINDOW );

タスクバーから消します。
SetWindowLong( Handle, GWL_EXSTYLE , GetWindowLong(Handle, GWL_EXSTYLE)&~WS_EX_APPWINDOW );

Form ごとに独立します。
SetWindowLong( Handle, GWL_HWNDPARENT, 0 );

元に戻します。
SetWindowLong( Handle, GWL_HWNDPARENT, Application->Handle );






タスクトレイに表示

タスクトレイとはタスクバーの右下はしにある少しへこんだところ。

[unit1.h]
#define WM_TRAYICON (WM_USER +400)      //だいたい
void __fastcall WMTrayIcon(TMessage &mkey);
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER( WM_TRAYICON, TMessage , WMTrayIcon)
END_MESSAGE_MAP(TForm)


[アイコンを登録]
NOTIFYICONDATA nid;
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;      // どれだけの機能を使うか
nid.hWnd = Handle;                              // アイコンが出すメッセージを受けるウィンドウ
strcpy( nid.szTip, "アイコンの上にカーソルを持ってきたときのヘルプ" );
nid.hIcon = Application->Icon->Handle;          // 表示するアイコンのハンドル
tnd.uID = (UINT)( 0 );                          // アイコンをたくさん登録するときの識別子
nid.uCallbackMessage = WM_TRAYICON;
Shell_NotifyIcon( NIM_ADD, &nid );


[アイコンを削除]
登録と同じ要領で NOTIFYICONDATA 構造体を設定し、ただし uFlags メンバーを 0 にします。
最後を「 Shell_NotifyIcon( NIM_DELETE, &nid ); 」に(一番目の因数が違うのに注意)。


[アイコンが出すメッセージの受け入れ関数]
void __fastcall TForm1::WMTrayIcon( TMessage msg )
{
    if (msg.WParam == 0) {                      //msg.WParam には識別子
        if (msg.LParam == WM_LBUTTONDOWN) {     //msg.LParam にはウィンドウ・メッセージが入る
            // アイコンがクリックされたときの処理
        }
    }
}






キーバッファやマウスイベントをクリア


MSG msg;
while( PeekMessage(&msg, Handle, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) );//キーバッファ
while( PeekMessage(&msg, Handle, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) );//マウスイベント






フォームの閉じるボタン(X)を押せなくする


HMENU hMenu = GetSystemMenu( Handle, false );
if (hMenu) {
    int mc = GetMenuItemCount(hMenu);
    if (mc > 0) {
        int mi = GetMenuItemID(hMenu, mc-1);
        EnableMenuItem(hM, mi, MF_GRAYED);    //MF_ENABLEDにすると押せる
    }
}

ヘルプボタン、最大化最小化なども押せなくできるます。






OpenDialog で閉じるボタン(X)とヘルプボタン(?)を消す


OpenDialog の OnShow イベントで

HWND hWnd = GetParent( dynamic_cast<TOpenDialog*>(Sender)->Handle);

SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_SYSMENU );//×を消す

SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_CONTEXTHELP );//?を消す






スクリーンセーバーの実行、停止、その取得


[実行]
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, true,0,
                     SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);

[停止]
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, false,0,
                     SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);


[状態の取得]
long lActive = 0;
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0x00, &lActive, 0x00);
if (lActive) {
    //動いている
} else {
    //動いてない
}






透明なウインドウを作るには

重なる他のウインドウやディスクトップ上のアイコンも全て表示しない(壁紙のみを表示する)やり方です。

[unit1.h]
private:        // ユーザー宣言
    void __fastcall WMEraseBkgnd(TWMEraseBkgnd &msg);
    void __fastcall WMMove(TWMMove &msg);
public:         // ユーザー宣言
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_ERASEBKGND,TWMEraseBkgnd,WMEraseBkgnd)
    MESSAGE_HANDLER(WM_MOVE,TWMMove,WMMove)
END_MESSAGE_MAP(TForm)

[unit1.cpp]
void __fastcall TForm1::WMEraseBkgnd(TWMEraseBkgnd &msg)
{
    // 壁紙だけを表示
    DefWindowProc(GetDesktopWindow(),WM_ICONERASEBKGND,(WPARAM)msg.DC,0);
    msg.Result= 1;
}
void __fastcall TForm1::WMMove(TWMMove &msg)
{
    Invalidate();
}

DefWindowProc中のGetDesktopWindow()はForm1->Handleでも可






ドライブの種類を調べるには

ドライブの種類を調べるには、GetDriveTypeというWindowsAPIを使用します。

  switch(GetDriveType("C:\"))  // Cドライブを調べる
		  {
		    case 0:                // わからない
		    case 1:                // ドライブが存在しない
		    case DRIVE_REMOVABLE:  // フロッピーディスク
		    case DRIVE_FIXED:      // ハードディスク
		    case DRIVE_REMOTE:     // ネットワークドライブ
		    case DRIVE_CDROM:     // CD−ROM
		    case DRIVE_RAMDISK:    // RAMディスク
		  }

※ドライブの指定は”A:\”、”B:\”、”C:\” のようにASCIZ(NULLで終了する文字列)を指定します。NULLを指定した場合はカレントドライブを返します。






フォルダ選択ダイアログの使い方

 フォルダ選択ダイアログを使用するには、SHBrowseForFolderというWindowsAPIを使用します。ヘッダーファイルShlObj.hをインクルードして下さい。SHBrowseForFolderに渡すBROWSEINFO構造体のパラメータをデータとして定義します。

  BROWSEINFO info;
		  char path[256];

		  info.hwndOwner = Panel1->Handle;
		  info.pidlRoot =  NULL;
		  info.pszDisplayName = path;
		  info.lpszTitle = "ファイル選択";
		  info.ulFlags = BIF_RETURNONLYFSDIRS;
		  info.lpfn = NULL;
		  info.lParam = NULL;
		  info.iImage = 0;

		  SHBrowseForFolder(&info);






特別なディレクトリのパスの得方

 特別なディレクトリのパスを得るWindowsAPIには、GetWindowsDirectory、GetSystemDirectory、GetCurrentDirectoryなどがあります。

  char buf[128];

		  // Windowsディレクトリ
		  GetWindowsDirectory(buf, 128);

		  // WindowsのSystemディレクトリ
		  GetSystemDirectory(buf, 128);

		  // カレントディレクトリ
		  GetCurrentDirectory(128, buf);

		  // 作業用フォルダ
		  GetTempPath(128, buf);






他のアプリケーションの実行方法

 プログラムの実行中に他のアプリケーションを実行するには、ShellExecuteというWindowsAPIを使用します。ShellAPI.hをインクルードして下さい。また、3番目の引数は"*.BMP"等の関連付けされたファイルに設定することも可能です。

  ShellExecute(Application->Handle,
		               "open",
		               "c:\\winnt\\calc.exe",
		               NULL,
		               NULL,
		               SW_SHOW);






WAVEファイルの再生方法

 WAVEファイルを再生するには、sndPlaySound関数を使用します。MMSystem.hをインクルードして下さい。

  OpenDialog1->Execute();
		  sndPlaySound(OpenDialog1->FileName.c_str(), SND_ASYNC);






MIDIファイルの再生方法

 MIDIファイルの再生するには、TMediaPlayerコンポーネントを使用するのが簡単です。

  // 演奏するファイルの指定
		  MediaPlayer1->FileName = OpenDialog1->FileName;
		  // デバイスオープン
		  MediaPlayer1->Open();
		  // 演奏開始!
		  MediaPlayer1->Play();






時間の設定

 時間の設定です。二通りの方法を記載していますが、内容は一緒です。

  SYSTEMTIME system_time;
		  system_time.wYear = 2007;
		  system_time.wMonth = 6;
		  system_time.wDay = 15;
		  system_time.wHour = 9;
		  system_time.wMinute = 37;
		  system_time.wSecond = 00;
		  system_time.wMilliseconds = 0;
		  SetLocalTime(&systemtime);


  TSystemTime system_time;
		  TDateTime date_time("2007/06/15 9:37:00");
		  DateTimeToSystemTime(date_time, system_time);
		  SetLocalTime(&system_time);






このページ直接たどり着いた方は、Topページに戻ってください。

by kenji-b
Copyright (C) 1998-2001 kenji-b homepage All Rights Reserved.