ウィンドウズアプリ入門 クリップボードにコピーされたらメッセージを受信する方法

 Windowsアプリでコピーされたときにイベントを取得できると便利です。例えばコピーされた内容を画面に表示したい場合などです。 もちろんタイマーイベントで定期的にポーリングをする方法もありますが、やや無駄な処理かもしれません。

Windowsとしてはコピーされたときのイベントを取得できる仕組みになっていますので使わない手はないと考えます。

上図がこのイベントを処理するためのコードの一部です。まず、Visutal C++でウィンドウアプリを新規作成します。そして以下の部分にコードを追加します。

case WM_CREATE:
    AddClipboardFormatListener(hWnd); //クリップボードの監視開始
    break;

これをウィンドプロシージャに追加します。 この部分は標準ではないのでそのまま追加してください。 このコードでは、ウィンドウが作成されたときに WM_CREATE:が呼ばれて、AddClipboardFormatListenerという関数が呼ばれます。この関数はこのアプリがクリップボードの監視を開始するための物です。

case WM_DESTROY:
    RemoveClipboardFormatListener(hWnd);    //クリップボードの監視終了

既にある WM_DESTROY: という部分にRemoveClipboardFormatListener(hWnd);関数を追加します。この関数はクリップボードの監視を終了するための物です。

case WM_CLIPBOARDUPDATE:
    MessageBox(hWnd, (LPCWSTR)L"情報", (LPCWSTR)L"コピーされました", MB_OK);  //メッセージボックスの表示

最後にこのコードを追加します。これはクリップボードに何かコピーされたら呼び出される、WM_CLIPBOARDUPDATEイベントです。そして、これが呼ばれたらメッセージボックスが表示されます。

以上簡単なコードでした。 これでクリップボードにコピーされたら何か処理を行う準備が出来ました。そのあとはクリップボードの内容を取得して画面表示したりファイルに保存したりできます。 いろいろ応用が出来るので是非使ってみて下さい。

G++ でコンパイルできるシンプルなウィンドウ

 G++でコンパイルできるサンプルコードです。実行するとシンプルなウィンドウが表示されます。ただこれだけですが、これがウィンドウプログラミングのはじめの一歩です。まずは、これをコンパイルできるようにしてください。

  1. #include <windows.h>
  2. /*************************************
  3. ただウィンドウを表示するだけのアプリです。以下のコマンドラインでアプリを作成できます。
  4. g++ -o 001_plainwindow.exe 001_plainwindow.cpp -mwindows -m64
  5. 注意点としては、001_plainwindow.cpp と言う名前でこのテキストファイルを保存してください。
  6. 保存するときは UTF-8 BOM無しで保存してください。Windows標準のメモ帳よりサクラエディタなどのコーディングするエディタを使う事をお勧めします。
  7. コメントにカスタマイズ方法を書いておきます。色々楽しんでみて下さい。
  8. **************************************/
  9. // ウィンドウプロシージャ(こういう名前の固有名称です覚えてください。)
  10. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  11.     switch (uMsg) {
  12.  
  13.         //ウィンドウが閉じられたときに呼ばれます
  14.         case WM_DESTROY:
  15.             // 終了時にメモリを解放
  16.             PostQuitMessage(0);
  17.             break;
  18.         default:
  19.             return DefWindowProcW(hwnd, uMsg, wParam, lParam);
  20.     }
  21.     return 0;
  22. }
  23. // 最初に呼ばれる関数です。エントリポイントとも言われます。これはほぼ作法です。
  24. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  25.     // ウィンドウクラスの登録
  26.     WNDCLASSW wc = {0};
  27.     wc.lpfnWndProc = WindowProc;
  28.     wc.hInstance = hInstance;
  29.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  30.     wc.lpszClassName = L"SimpleEditWindowClass";
  31.     RegisterClassW(&wc);
  32.     // ウィンドウの作成 "シンプルなウィンドウ"と書かれている部分はタイトルバーの表示です。好きなものに変えてみて下さい。640,480と言う数字はウィンドウの大きさです。変えてみて下さい。
  33.     HWND hwnd = CreateWindowExW(0, L"SimpleEditWindowClass", L"シンプルなウィンドウ", WS_OVERLAPPEDWINDOW,
  34.                                 CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL);
  35.     
  36.     // ウィンドウ表示
  37.     ShowWindow(hwnd, nCmdShow);
  38.     UpdateWindow(hwnd);
  39.     // メッセージループ
  40.     MSG msg;
  41.     while (GetMessageW(&msg, NULL, 0, 0)) {
  42.         TranslateMessage(&msg);
  43.         DispatchMessageW(&msg);
  44.     }
  45.     return static_cast<int>(msg.wParam);
  46. }

まず、このプログラムには理屈はありません。こういう作法で組むと思ってください。まず、最初にWinMainという関数が呼び出されます。これはC言語の基礎で習うmain関数と同じです。ウィンドウプログラムの場合はこちらが呼び出されます。

次にウィンドウプロシージャーと呼ばれる関数が呼ばれます。このサンプルプログラムではWM_DESTROY というウィンドウが閉じられたときの処理だけが書かれていますが、Case文の要素としてウィンドウが開かれたときやマウスをクリックされたときなど多くの処理をここに追加して機能を増やしていきます。

それより、まずはこのプログラムをコンパイルして実行ファイルを作ることを最初に考えてください。コンパイルするためにはMinGWという開発環境が必要です。これはソースフォージから「x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z」と言うファイルをダウンロード解凍して、Cドライブにコピーしてください。そして、環境設定でPATHをBINに通してください。 これでコンパイルが可能です。

  1. g++ -o 001_plainwindow.exe 001_plainwindow.cpp -mwindows -m64

コマンドプロンプトをソースファイルのあるフォルダ(ディレクトリ)で実行し、上記コマンドを入力すればこんぱいる、ビルドが終了します。 そのあとは出来た実行ファイルを開いてください。 ソースファイルは必ずUTF-8のBOM無しで作成してください。

これで初めてのウィンドウプログラムが作成できたと考えます。

Chrome OS Flex をWindows Vista時代のパソコンにインストール FRDS330120WA Frontier フロンティア神代


10年以上前に買って今では銀行ファームバンキングのモデムアクセスマシンとして使っていたフロンティアのパソコンがファームバンキングサービスの終了で不要になりました。 もちろんネットに接続すればブラウザマシンとして使えますが、OSがVISTAなのでセキュリティー的に問題があります。

ここで古いPCにインストールすれば最新セキュリティで安心して使えると言われている Chrome OS Flexを試してみました。

結果はとりあえずインストールと起動が出来ました。ブラウザも動作し、YouTube動画も見れました。 しかし、動画は時々コマが飛ぶ感じです。そのためパフォーマンス的には問題あるかもしれません。

どうしてもパソコンが欲しいという用途なら使えそうですが、他にパソコンやタブレットを持っている人は無理して使わなくても良いと考えます。

ウチではインストールして使う事を確認した後はリサイクルショップにジャンクとして販売してしまいました。 まあ、10年使えば十分なのではと考えます。


インストール手順は

  1. 8G程度のUSBフラッシュメモリーを準備
  2. 手持ちのPCのChromeブラウザから追加機能で Chrome OS Flexをインストール
  3. その指示でUSBフラッシュメモリーにインストールメディアを作成する。
  4. 目的のPCをUSBドライブで起動できるようにして指示に従いインストールする。ハードウェアの種類は Google → Chrome OS Flexを選びます
PCのスペックは
  • メーカー Frontier フロンティア神代
  • 型式 FRDS330120WA (FRDS3301/20WA)
  • CPU Intel Celeron Dual-Core E1200 1.6GHz
  • SSD 120GB
  • メモリ 2048MB
  • ビデオカード nVidia の安い物(メモ忘れました)
これで終了です。Windowsなどのインストールに慣れている人であれば特に面倒は無いと考えます。

G++でコンパイル、ビルドできるwindowsプログラム

 今では開発環境が充実しており「簡単に」ウィンドウプログラムを開発することが出来ます。しかし、生成されるプログラムは色々なDLLやコンポーネントが必要であることが多いです。ビルドすると色々なファイルが生成されるわけです。

ただ、こちらとしては一個のEXEファイルだけで十分なわけです。今回はそのニーズにこたえるコードを説明します。

このコードは簡易的なテキストエディタです。元々はChatGPTに作成してもらった、単機能なものです。コピペ、簡単な編集、表示内容の拡大縮小が出来ます。通信や管理できない領域へのデータ保存は一切していないので安心です。

実用品としても十分使えますが、簡易的な開発実験も出来るファイルだと考えます。以下がソースコードです。

  1. #include <windows.h>
  2. /*
  3. メモ代わりに使える通信機能も保存機能もないエディタです。
  4. パスワードやメモなどセキュリティー的に危ない物を一時的に保管するのに役立ちます。
  5. G++で各自がコンパイルすれば危ない機能とか事前に確認できます。
  6. 試用する前にコードレビューも出来るので安心して使ってください。
  7. コンパイル・ビルド方法
  8. g++ -o hoge.exe piyo.cpp -mwindows
  9. */
  10. // メニューアイテムのID
  11. #define IDM_FONT_SIZE_INCREASE 101
  12. #define IDM_FONT_SIZE_DECREASE 102
  13. #define IDM_ALLSELECT 103
  14. //定数
  15. #define FONT_SIZE_MIN 10
  16. #define FONT_SIZE_MAX 100
  17. //アクセラレーターテーブル
  18. ACCEL accel[] = {
  19.   { FCONTROL | FVIRTKEY, 'W', IDM_FONT_SIZE_INCREASE },
  20.   { FCONTROL | FVIRTKEY, 'S', IDM_FONT_SIZE_DECREASE },
  21.   { FCONTROL | FVIRTKEY, 'A', IDM_ALLSELECT },
  22.  };
  23. // フォントサイズを変更する関数
  24. void ChangeFontSize(HWND hTarget,HFONT *pfFont,int delta) {
  25.     LOGFONTW lf;
  26.     GetObjectW(*pfFont, sizeof(LOGFONTW), &lf);
  27.     lf.lfHeight += delta;
  28.     if (lf.lfHeight < FONT_SIZE_MIN) {
  29.         lf.lfHeight = FONT_SIZE_MIN;
  30.     }
  31.     if (lf.lfHeight > FONT_SIZE_MAX) {
  32.         lf.lfHeight = FONT_SIZE_MAX;
  33.     }
  34.     DeleteObject(*pfFont);
  35.     *pfFont = CreateFontIndirectW(&lf);
  36.     SendMessageW(hTarget, WM_SETFONT, (WPARAM)*pfFont, TRUE);
  37. }
  38. // ウィンドウプロシージャ
  39. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  40. static HWND hEdit;
  41. static HMENU hMenu;
  42. static HFONT hFont;
  43.     
  44.     switch (uMsg) {
  45.         case WM_COMMAND:
  46.             // メニューアイテムが選択された場合
  47.             switch (LOWORD(wParam)) {
  48.                 case IDM_FONT_SIZE_INCREASE:
  49.                      ChangeFontSize(hEdit,&hFont,2);
  50.                     break;
  51.                 case IDM_FONT_SIZE_DECREASE:
  52.                      ChangeFontSize(hEdit,&hFont,-2);
  53.                     break;
  54.                 case IDM_ALLSELECT:
  55.                      SendMessage(hEdit, EM_SETSEL, 0, -1);
  56.                     break;
  57.             }
  58.             break;
  59.         case WM_CREATE:
  60.             // エディットコントロールを作成
  61.             hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
  62.                                     10, 10, 400, 300, hwnd, (HMENU)0, GetModuleHandleW(NULL), NULL);
  63.  // メニューを作成
  64.             hMenu = CreateMenu();
  65.             AppendMenuW(hMenu, MF_STRING, IDM_FONT_SIZE_INCREASE, L"拡大 ctrl+W");
  66.             AppendMenuW(hMenu, MF_STRING, IDM_FONT_SIZE_DECREASE, L"縮小 ctrl+S");
  67.             AppendMenuW(hMenu, MF_STRING, IDM_ALLSELECT, L"全選択 ctrl+A");
  68.             SetMenu(hwnd, hMenu);
  69.             // デフォルトフォントを設定
  70.             hFont = CreateFontW(32, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
  71.                                 CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial");
  72.             SendMessageW(hEdit, WM_SETFONT, (WPARAM)hFont, TRUE);
  73.             break;
  74.         case WM_SIZE:
  75.              // ウィンドウサイズが変更された場合、エディットコントロールも調整
  76.             MoveWindow(hEdit, 10, 10, LOWORD(lParam) - 20, HIWORD(lParam) - 20, TRUE);
  77.             break;
  78.         case WM_DESTROY:
  79.             // 終了時にメモリを解放
  80.             PostQuitMessage(0);
  81.             break;
  82.         default:
  83.             return DefWindowProcW(hwnd, uMsg, wParam, lParam);
  84.     }
  85.     return 0;
  86. }
  87. // エントリーポイント
  88. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
  89.     
  90.     // ウィンドウクラスの登録
  91.     WNDCLASSW wc = {0};
  92.     wc.lpfnWndProc = WindowProc;
  93.     wc.hInstance = hInstance;
  94.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  95.     wc.lpszClassName = L"SimpleEditWindowClass";
  96.     RegisterClassW(&wc);
  97.     //アクセラレーターテーブルの作成
  98.     HACCEL hAccel = CreateAcceleratorTableA(accel,sizeof(accel)/sizeof(accel[0]));
  99.     
  100.     
  101.     // ウィンドウの作成
  102.     HWND hwnd = CreateWindowExW(0, L"SimpleEditWindowClass", L"シンプルテキストメモ", WS_OVERLAPPEDWINDOW,
  103.                                 CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL);
  104.     // ウィンドウ表示
  105.     ShowWindow(hwnd, nCmdShow);
  106.     UpdateWindow(hwnd);
  107.     // メッセージループの処理(アクセラレーターテーブルの処理付)
  108.     MSG msg;
  109.    while (GetMessage(&msg, NULL, 0, 0))
  110.     {
  111.         if (!TranslateAccelerator(hwnd, hAccel, &msg))
  112.         {
  113.             TranslateMessage(&msg);
  114.             DispatchMessage(&msg);
  115.         }
  116.     }    
  117.     
  118.     return static_cast<int>(msg.wParam);
  119. }

このコードを「hoge.cpp」という名前で保存してから、「g++ -o hoge.exe piyo.cpp -mwindows」でコンパイル、ビルドすると piyo,exe が作成されます。その実行ファイルを開くことで簡易的なテキストエディタを表示させることが出来ます。

ぜひ、プログラミングの入門として活用してみて下さい。コードの追加も普通なCやC++の知識で可能です。分からない人は以下の本で勉強してみて下さい。

右クリックでクリップボード内の画像をファイル保存する設定

 スクリーンショットやプログラムから画像をコピーしてもそのあとにファイルにしたい場合は画像編集ソフトを起動する必要があり面倒です。ここで Custom Context Menu と PowerShell を使った方法を説明します。 Custom Context Menu はあらか...