Top > Programming > Tips
Table of Contents

はじめに

このページは私の個人メモです。疑わしいところがあったらコメントやメールで穏便に(淫靡に)教えてください。

[WindowsAPI] ウィンドウを強制的にフォアグラウンドにする

MSDNのSetForegroundWindowの項を読めばわかるように、この関数を使ってもいつもウィンドウをフォアグラウンドにすることができるわけではない。いくつかの条件を満たした時しかフォアグラウンドにはならない(その条件がMSDNに書いてある)。そこを曲げて何がなんでもフォアグラウンドを取る方法(ではないかもしれないが、いまのところそういうことで)。

hwnd: フォアグラウンドにしたいウィンドウのウィンドウハンドル

HWND hwndActive = GetForegroundWindow();
DWORD thisThreadId = GetCurrentThreadId();
DWORD activeThreadId = GetWindowThreadProcessId(hwndActive, NULL);
AttachThreadInput(thisThreadId, activeThreadId, TRUE);

SetForegroundWindow(hwnd);

AttachThreadInput(thisThreadId, activeThreadId, FALSE);

元のウィンドウをフォアグラウンドに戻すときは、

SetForegroundWindow(hwndActive);

で足りる(自分がフォアグラウンドになっているのでその権利がある)。

[WindowsAPI] stdoutへのunicodeの出力

(stdin, stderrへも応用できる)

_setmode(_fileno(stdout), _O_U8TEXT); // UTF-8 _setmode(_fileno(stdout), _O_U16TEXT); // UTF-16 _setmode(_fileno(stdout), _O_WTEXT); // unicode

動作の詳細はMSDNの _open 関数 を参照

[C++] C++のストリーム入出力とC stdioの混用

  • プログラムの最初の方で次の関数を呼ぶ。

    std::ios_base::sync_with_stdio();

[Windows,C++]ANSI以外のロケールは明示的に設定しなければならない

「プログラムの起動時に、次のステートメントと同等の処理が実行されます」

setlocale( LC_ALL, "C" );

_tsetlocale(LC_ALL, _T(""));

とすると、「ロケールは実装で定義されているネイティブ環境になります」 (MSDNの _tsetlocale 関数 を参照)。

[C++]std::basic_ios::imbueによるcin, cout, cerrのロケールの設定

まだよくわかっていない。 imbueでググること。

[WindowsAPI] ファイルの関連付けに基づくアイコンの取得

  • ExtractAssociatedIcon()では望みのものを取得できなかった。
  • SHGetFileInfo()を用いる。
  • フォルダアイコンなど、システムが持っているものについては、SHGetStockIconInfo()が使えるかもしれない。

[WindowsAPI] diropen(), dirclose()に相当するWindowsAPI

  • FindFirstFile(), FindNextFile(), FindClose()

Tag: Programming Tips