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

 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++の知識で可能です。分からない人は以下の本で勉強してみて下さい。

クリップボードの空白行を削除するコマンドレット ショートカット

 空白行など無駄な行を削除するのが面倒だと思っていませんか?こんな時に便利なショートカットの作り方を紹介します。これを作っておけばコピーしてショートカットを実行するだけで、無駄な行が削除されます。

ああああああああああああああ
いいいいいいい
うううう

えええええええ

おおおおお

こんな文章があった場合に、コピーして実行すると

ああああああああああああああ
いいいいいいい
うううう
えええええええ
おおおおお

このように無駄な行が削除されます。便利です。

ショートカットの作り方は、デスクトップなどで右クリックして「新規作成、ショートカット」を選び、場所の入力で以下のコードを入れてください。

powershell -NoLogo -Command "& {Get-Clipboard |Where-Object { $_ -notmatch '^\s*$' }  | Set-Clipboard}"

これで文書をコピーして、実行した後に張り付けてください。

今日の日付や今の日時をコピペしたい場合(Powershell ショートカット)

 今日の日付や今の時刻を入力したい場合に自分で手打ちしていないでしょうか?これは面倒だし、ミスもあります。そもそも、コンピュータを使っているのだからそういう作業は自動化させてみることをおすすめします。

方法は非常に簡単です。右クリックメニューでショートカットの作成を選択して。項目の場所という項目に以下を入れるだけです。

powershell.exe -NoLogo -Command "& {(Get-Date -Format 'yyyy年MM月dd日hh時mm分ss秒') | Set-Clipboard}"

これで、ショートカットを作成し、わかりやすい名前で保存すれば準備完了です。その後に、日付や日時を取得したい場合はそのショートカットを実行して下さい。日付や時刻がコピーされますので後は貼り付けて下さい。

今回のサンプルでは年月日と時分秒が日本語の単位付きで表示されていますが、コードの修正で好きなように出来ます。秒が要らない場合、単位が要らない場合など色々な対応が可能です。

応用例

間違えなく日付を入力したい場合はもちろん、重複しないファイル名を作りたい場合に役立ちます。人の作業であれば、このショートカットで秒まで入れれば重複は考えられません。

今回のショートカットはPowershellという仕組みを利用しています。Windows標準の仕組みなので会社でも問題なく使えると考えます。

AmazonでPowershell

ボイスメモを簡単にパソコンに転送する方法 iTunes 社外アプリ不要 必要なものはカメラコネクションキット iOS iPhone


ボイスメモのファイルをパソコンに転送するのは意外に手間がかかります。iTunesを使う方法が紹介されますが正直挙動が良く分かりません。 社外アプリも便利ですが、アドウェアや良くわからない課金システムでインストールするのが怖いです。

今回の方法は、『カメラコネクションキット』を使ってメモリカードにコピーする方法です。カメラコネクションキットは必要ですが、Apple認証の社外品であれば千円程度で買えます。多少お金がかかりますが、安定動作という意味では強いです。

一番の利点はパソコン側にソフトのインストールが不要なところです。メモリーカードスロットがあれば対応します。

手順

  1. ボイスメモで目的の音声をコピーする
  2. カメラコネクションキットを接続
  3. メモリーカードをカメラコネクションキットに挿入
  4. ファイルアプリを起動する(Apple純正品です)
  5. メモリーカードの中に入り、長押ししてペーストする。これで音声ファイルがメモリーカードにコピーされました。
  6. メモリーカードをパソコンに挿入してコピーする

です。これで、iPhoneで録音した音声ファイルをパソコンで活用できます。

実は小容量の音声であればメールで送信するほうが楽です。特に会社で使っている場合は一般社員でもメールのほうが使いやすいです。

今回の方法を会社で使う場合は、メモリーカードの読み込みがあるので稟議などが必要かもしれません。ただ、読み込みなので制限は甘いかも知れません。 詳しくは社内情報担当に相談してみて下さい。

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

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