エディットコントロールにクリップボードの内容を出力してみた
2015/07/12
今回はテキスト入力を処理する「エディットコントロール」を作ってみた。
前回取得したクリップボードの内容を表示してみる。
今回も文字に関する部分でメモをしておきたいところがあったので、別記事に分けることにする。
結構致命的なバグがあったのでソースの一部と下記に追記(15/7/16)
使用する関数
CreateWindow()、エディットコントロールを作る
SetWindowText()、エディットコントロールに文字をセットする
とりあえず、コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){ static HWND edit; switch(msg){ case WM_CREATE: AddClipboardFormatListener(hwnd); // エディットを作成 edit = CreateWindow( L"EDIT", NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 0,0,200,30, hwnd, NULL, ((LPCREATESTRUCT)(lp))->hInstance, NULL ); return 0; case WM_DESTROY: RemoveClipboardFormatListener(hwnd); PostQuitMessage(0); return 0; case WM_CLIPBOARDUPDATE: LPWSTR text = getClipboardText(hwnd); // クリップボードの内容を取得する関数 if(text!=NULL){ SetWindowText(edit,text); // エディットコントロールに表示 free(text); // メモリの開放(関数内部で malloc したので) }else{ SetWindowText(edit, L"No text." ); } return 0; } return DefWindowProc(hwnd,msg,wp,lp); } // クリップボードの内容を取得する。mallocで確保したメモリを返却しているので後で解放する LPWSTR getClipboardText(HWND hwnd){ HGLOBAL hg; LPWSTR strClip, text=0; if( OpenClipboard(hwnd) && (hg=GetClipboardData(CF_UNICODETEXT)) ){ text = (LPWSTR)malloc( GlobalSize(hg) ); strClip = (LPWSTR)GlobalLock(hg); if(text!=NULL && strClip!=NULL) lstrcpy(text, strClip); GlobalUnlock(hg); <s>CloseClipboard();</s> // <strong>ココだとテキスト以外の場合closeされない</strong> } CloseClipboard(); // <strong>if文の外に書いた方がいい</strong> return text; } |
クリップボードの内容が変更されると、その中身がエディットコントロールに表示される。
メモリ確保の仕方や解放のタイミングなど、いまいち不安だけど一応目的の動作は出来た。
要点
lpClassNameに「EDIT」(既定のウィンドウクラス名)を指定する。
hInstanceは ((LPCREATESTRUCT)(lp))->hInstance で取得できる。
あとはスタイルとかの細々した設定。
文字列を設定したいウィンドウハンドルと設定したい文字列を指定する。
今回は edit を渡したのでエディットコントロールに文字列が表示されたが、親の hwnd を渡すとウィンドウのタイトル部分に表示される。
実行時の画像を貼ってみたけど、これじゃよくわからないかな~
追記
変更前だとCloseClipboardの位置が悪いため、テキスト以外(画像など)をコピーした際にクリップボードが閉じられない。そのため、ほかのアプリなどからクリップボードにアクセスできなくなる。
結果、自分のアプリに限らず「コピペ自体効かなくなる」という、非常に嫌な感じの状態になった。
関連記事
-
「>」、「<」を含む文字列をコピーしたら自動でエスケープ文字にするアプリを作った
以前、文字列置換の記事でちょこっと書いたものを実際に作ってみた。クリップボードの …
-
C言語(win32api)で文字列の置換。改善の余地あり
コピー → 置換 → ペースト。 ある文字列をコピーした際、既定した文字列で自動 …
-
Unicode?Ansi?Windowsでの文字列の表現が紛らわしい
エディットコントロールを作る際に「文字列リテラル」について考えたこと。 定義した …
-
クリップボードの内容を取得しよう→_crtisvalidheappointerエラーで落ちる
前回の記事でClipboardを取得する際に発生したエラーについて こちらのペー …
-
クリップボードの内容を取得してみた
何を書けばいいのかわからなくなってきた。 行動指針が見つからない。今、自分は何を …
スポンサーリンク
週間人気記事
Android Serviceのメモ。onBind,onRebind,onUnbindが呼ばれる条件
Android「標準ブラウザ」から「Chrome」へブックマークを移行する方法