フリーソフト

システム関連

[VC++] 標準入力に入力されたパスワードを隠す方法

http://ja.softuses.com/188813

-------------------------
#include<iostream>
#include<string>
#include<conio.h>

int main()
{
  std::string password;
  char ch;
  const char ENTER = 13;

  std::cout << "enter the password: ";
  while ((ch = _getch()) != ENTER) {
    password += ch;
    std::cout << '*';
  }
}
-------------------------

[C++Builder] オートコンプリート IAutoComplete2の使い方

ソースをそのままのせます。

ヘッダーファイル

//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> #include <ShlObj.h> #include <ComObj.hpp> #include <ShlGuid.h> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント   TMemo *Memo1;   TEdit *Edit1;   void __fastcall FormCreate(TObject *Sender); private: // ユーザー宣言   IAutoComplete2 *FAutoComplete;   IUnknown *FStrings; public: // ユーザー宣言   __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- class TEnumString: public IEnumString { private:   TStringList *FStrings;   ULONG FIndex;   ULONG FRefCount; public:   //IUnknown implementation   STDMETHODIMP_(ULONG) AddRef();   STDMETHODIMP_(ULONG) Release();   STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject); protected:   HRESULT STDMETHODCALLTYPE Next(ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched);   HRESULT STDMETHODCALLTYPE Skip(ULONG celt);   HRESULT STDMETHODCALLTYPE Reset(void);   HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum); public:   __fastcall TEnumString(void);   __fastcall TEnumString(TStrings *Strings);   __fastcall ~TEnumString(void);   void __fastcall Clear(void);   void __fastcall Add(UnicodeString S);   void __fastcall Assign(TStrings *Source); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif

ソースファイル
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; /* TEnumString */ //--------------------------------------------------------------------------- __fastcall TEnumString::TEnumString(void)   :IEnumString() {   FStrings=new TStringList;   FStrings->Sorted=true;   FStrings->Duplicates=dupIgnore; } //--------------------------------------------------------------------------- __fastcall TEnumString::TEnumString(TStrings *Strings)   :IEnumString() {   FStrings=new TStringList;   FStrings->Sorted=true;   FStrings->Duplicates=dupIgnore;   this->Assign(Strings); } //--------------------------------------------------------------------------- __fastcall TEnumString::~TEnumString(void) {   delete FStrings; } //--------------------------------------------------------------------------- STDMETHODIMP_(ULONG) TEnumString::AddRef() {   return ::InterlockedIncrement(reinterpret_cast<LONG*>(&FRefCount)); } //--------------------------------------------------------------------------- STDMETHODIMP_(ULONG) TEnumString::Release() {   ULONG nCount=(ULONG)::InterlockedDecrement(reinterpret_cast<LONG*>(&FRefCount)); if (nCount==0) delete this;   return nCount; } //--------------------------------------------------------------------------- STDMETHODIMP TEnumString::QueryInterface(REFIID riid, void** ppvObject) {   HRESULT hr=E_NOINTERFACE;   if (ppvObject!=NULL) {     *ppvObject=NULL;     if (IID_IUnknown==riid)       *ppvObject=static_cast<IUnknown*>(this);     if (IID_IEnumString==riid)       *ppvObject=static_cast<IEnumString*>(this);     if (*ppvObject!=NULL) {       hr = S_OK;       ((LPUNKNOWN)*ppvObject)->AddRef();     }   } else {     hr=E_POINTER;   }   return hr; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Next(ULONG celt,LPOLESTR *rgelt,ULONG *pceltFetched) {   HRESULT hr=S_FALSE;   if (!celt) celt=1;   ULONG i=0;   for (i = 0;i<celt;i++) {     if (FIndex>(ULONG)FStrings->Count-1) break;     UnicodeString Str=FStrings->Strings[FIndex];     rgelt[i] = (LPWSTR)::CoTaskMemAlloc((ULONG) sizeof(WCHAR)*(Str.Length()+1));     lstrcpy(rgelt[i], Str.w_str());     if (pceltFetched) *pceltFetched++;     FIndex++;   }   if (i == celt) hr=S_OK;   return hr; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Skip(ULONG celt) {   HRESULT hr=S_FALSE;   if ((FIndex+celt)<=(ULONG)FStrings->Count) {     FIndex+=celt;     hr=S_OK;   } else {     FIndex=FStrings->Count;     hr=S_FALSE;   }   return hr; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Reset(void) {   FIndex=0;   return S_OK; } //--------------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE TEnumString::Clone(IEnumString **ppenum) {   HRESULT Result=S_OK;   try {     *ppenum=new TEnumString(FStrings);     Result=S_OK;   } catch(...) {     Result=E_UNEXPECTED;   }   return Result; } //--------------------------------------------------------------------------- void __fastcall TEnumString::Clear(void) {   FStrings->Clear(); } //--------------------------------------------------------------------------- void __fastcall TEnumString::Add(UnicodeString S) {   FStrings->Add(S); } //--------------------------------------------------------------------------- void __fastcall TEnumString::Assign(TStrings *Source) {   FStrings->Assign(Source); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner)   : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) {   CoInitialize(NULL);   OleCheck(CoCreateInstance(CLSID_AutoComplete,NULL,CLSCTX_INPROC_SERVER,IID_IAutoComplete2,(void **)(&FAutoComplete)));   FStrings=new TEnumString(Memo1->Lines);   OleCheck(FAutoComplete->SetOptions(ACO_AUTOSUGGEST|ACO_UPDOWNKEYDROPSLIST));   OleCheck(FAutoComplete->Init(Edit1->Handle,FStrings,NULL,NULL)); } //---------------------------------------------------------------------------

[C++Builder,Delphi] デバッグウインドウにメッセージを表示する

OutputDebugString 関数を使うとIDEのデバッグ画面にメッセージを表示することができます。スレッドのデバッグなどに有効です。

[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));

より以前の記事一覧