API
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;
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); // シャットダウン
}
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;
[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);
}
[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) {
// ここに処理を書き込みます
}
}
[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); //ドラッグアンドドロップの許可
}
[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; // 連続してこの関数を呼ぶ
}
RECT rect; GetWindowRect(Handle, &rect); ClipCursor(&rect);
int n=3;
for (n+=n ; n-- ; ) {
FlashWindow(Handle,true);
DWORD t = GetTickCount()+100; //0.1秒間隔
while (GetTickCount()<t)
Application->ProcessMessages();
}
[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.
[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 にはウィンドウ・メッセージが入る
// アイコンがクリックされたときの処理
}
}
}
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にすると押せる
}
}
[実行]
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();
}
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ディスク
}
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);
char buf[128]; // Windowsディレクトリ GetWindowsDirectory(buf, 128); // WindowsのSystemディレクトリ GetSystemDirectory(buf, 128); // カレントディレクトリ GetCurrentDirectory(128, buf); // 作業用フォルダ GetTempPath(128, buf);
ShellExecute(Application->Handle, "open", "c:\\winnt\\calc.exe", NULL, NULL, SW_SHOW);
OpenDialog1->Execute(); sndPlaySound(OpenDialog1->FileName.c_str(), SND_ASYNC);
// 演奏するファイルの指定 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.