WindowsでPrintScreenを押すとスクリーンショットがクリップボードへコピーされますね。
Altキーを押したままPrintScreenを押すと、現在のウィンドウのみのスクリーンショットが取れます。
※ノートPCなんかではFnキーを押さないとPrintScreenとして動作しないものがあります。

このPrintScreenを押した時の動作をプログラミングにより自分で色々と変更したいと思った時にやった事をちょっと(ちょっとじゃないかも)書いてみたいと思います。
VC++でWinAPIを使ったやり方になります。

まず最初に思いついた事は、グローバルフックでPrintScreenキーのメッセージを横取りする事。
ただ、今回の場合はホットキーで十分事足りるので扱いが簡単なホットキーを使う事にしました。

ホットキーの登録はこんな感じ・・・

// PrintScreenを押した時
::RegisterHotKey(hWnd, 10, 0, VK_SNAPSHOT);

// Alt+PrintScreenを押した時
::RegisterHotKey(hWnd, 11, MOD_ALT, VK_SNAPSHOT);

※RegisterHotKeyで登録したホットキーは使わなくなったら必ずUnregisterHotKeyで解除を行います。

こんな感じでね・・・

::UnregisterHotKey(hWnd, 10);
::UnregisterHotKey(hWnd, 11);

こうする事で指定したウィンドウにそのPrintScreen(Alt+PrintScreen)が押されたらWM_HOTKEYという
ウィンドウメッセージが飛んできますのでそいつを捕まえてコードを書きます。

WM_HOTKEYでは、RegisterHotKeyで指定したホットキーの識別子がWPARAMに入ってきます。
上記の例でいくと、PrintScreenでは10、Alt+PrintScreenでは11を指定しています。
まぁ、この値は#defineしといた方がいいですが例なので直接書いてます。
なので判定としては

if(wParam == 10){
    // PrintScreenが押された時の処理
}else if(wParam == 11){
    // Alt+PrintScreenが押された時の処理
}

みたいに書けます。

じゃあPrintScreenによるスクリーンショットを無効化するか!
と思った場合、クリップボードをクリアしてあげればいいと思ってましたが、
どうやらホットキーとしてキーのイベントを奪ってしまうとそもそもスクリーンショットが
クリップボードへコピーされなくなっていました。
つまり、PrintScreenキーをホットキーとして登録しただけで、PrintScreenキーによる
スクリーンショットが無効化されてしまいました・・・

じゃあPrintScreenキーを押した時ログを残してスクリーンショットは通常通りやりたい!
・・・となった時、どうすればよいか?
スクリーンショットの処理を自分で書くしかないですね。
コードがアレですが、こんな感じで関数化してみました。

// スクリーンショットを取る
bool ScreenShot(HWND hWnd)
{
    // スクリーンサイズ
    int x = ::GetSystemMetrics(SM_CXSCREEN);
    int y = ::GetSystemMetrics(SM_CYSCREEN);
    int x1 = 0, y1 = 0;

    if(hWnd != NULL){
        // Alt+PrintScreenだったら作業中のウィンドウのみを取る
        WINDOWINFO wi;
        ::ZeroMemory(&wi, sizeof(wi)); // ねんのため
        wi.cbSize = sizeof(WINDOWINFO);
        if(!::GetWindowInfo(hWnd, &wi)) return false;
        x = wi.rcWindow.right - wi.rcWindow.left;
        y = wi.rcWindow.bottom - wi.rcWindow.top;
        x1 = wi.rcWindow.left;
        y1 = wi.rcWindow.top;
    }

    HDC hdc = ::GetDC(NULL);
    if(hdc == NULL) return false;
    HBITMAP hBitmap = ::CreateCompatibleBitmap(hdc, x, y);

    // エラー判定用
    bool bSuccess = (hBitmap != NULL);

    // ここから先は成功したかを判定しながら進む。

    // メモリデバイスコンテキストを作成
    HDC hdcMem;
    if(bSuccess){
        hdcMem = ::CreateCompatibleDC(hdc);
        bSuccess = (hdcMem != NULL);
    }

    // メモリデバイスコンテキストを選択
    HGDIOBJ hgdiobj;
    if(bSuccess){
        bSuccess = ((hgdiobj=::SelectObject(hdcMem, hBitmap)) != NULL);
    }

    // メモリデバイスコンテキストへビットマップを転送
    if(bSuccess){
        bSuccess = (::BitBlt(hdcMem,0,0,x,y,hdc,x1,y1,SRCCOPY) != 0);
    }

    // クリップボードへコピー
    if(bSuccess && ::OpenClipboard(NULL)){
        bSuccess = (::EmptyClipboard() != 0);
        if(bSuccess) bSuccess = (::SetClipboardData(CF_BITMAP, hBitmap) != NULL);
        ::CloseClipboard();
    }else bSuccess = false;

    // 後片付け
    if(hgdiobj != NULL) ::SelectObject(hdcMem, hgdiobj);
    if(hdcMem != NULL) ::DeleteDC(hdcMem);
    if(hBitmap != NULL) ::DeleteObject(hBitmap);
    if(hdc != NULL) ::ReleaseDC(hWnd, hdc);

    return bSuccess;
}

引数のhWndは見てのとおりスクリーンショットを取りたいウィンドウを指定します。
NULLを指定すると画面全体となります。
現在のウィンドウを取得するのにGetForegroundWindow()で取得したウィンドウを
使う事を想定してますが、問題ないすかね?
あと、戻り値はtrueが成功、falseが失敗です。

WinAPIと言っておきながらC言語ではなくC++の文法で書いてます。
C言語で書く場合は、::を外してboolをBOOL、trueをTRUE、falseをFALSEにして変数の定義をとりあえず関数の先頭に持ってくればいいんじゃないすかね。(適当)

実際に動かしたものからちょっと変更してますので
コンパイルが通らない時やうまく動かない時は自分で治してくださいw
間違いを指摘してもらえればありがたく修正しますw

また、これはマルチモニタの事は考慮してません。
マルチモニタの場合、おそらくプライマリディスプレイしか情報が取れません。。。
対応させるならEnumDisplayDevicesあたりを使う必要があるのかな?

今回も天草とはまったく関係ない話題でしたが、まぁ書くだけいいか、と割り切って書きましたw
10月5日から番号制度が施行されましたが、今後は企業では従業員の家族のマイナンバーまで管理する必要が出てきますよね?
このマイナンバーを含む情報は「特定個人情報」といい、本人の同意があったとしても利用目的を超えて使用してはいけないらしいです。
また、番号法と個人情報保護法は別だという事で、ややこしいですね。
こういう法令みたいな分野は超絶苦手で1行読めば眠くなるので詳しくは法令に詳しい人に聞いてください。
私は詳しく知らんですw

で、このマイナンバーですが、もし漏洩させたら(事故であっても)企業にとってマイナスにしかなりません。
なので管理には十分な注意が必要になります。

じゃあそのために何をします?
ネットワークを全面的に見直し、セキュリティを強化しますか?
まぁ、お金がある所ならそれでもいいでしょう。

でも、もっと簡単にできる事が2つあります。

まず、

(1) そもそもマイナンバーなんか扱うのを止める。
(2) マイナンバー廃止に向けて活動を行う。

いかん、つい本音が・・・www

(1) マイナンバーを管理しているPCをネットから完全に切り離す。
(2) 従業員の教育で道徳の授業を行う。

です。

(1)についてはまぁ誰でもわかるかと思います。
ネットに接続できなければネットからの流出はあり得ません。
また、この隔離したPCにはUSBメモリ等の書込みのできる外部媒体を使うのも極力止めておくべきです。

(2)についてですが、これが一番重要です。
要約すると悪い事はいけない事ですよという事を番号を管理する人に教育するんです。
「何言ってんだこいつ?」と思われるかもしれないですが、ベネッセとかの情報大量流出も
こういう悪意を持った人がいたせいですよね?
最終的には管理するなんです。
どんなに強固なセキュリティ対策をしていても、それを扱う人に悪意があれば流出なんか簡単に起こります。
防ぎようがないんですね。

だからこのマイナンバーの管理者の選定も信頼できる人でないといけないし、
重要な情報だという事を再認識させる意味で必要だという事です。

とは言っても人の悪意なんか簡単にわかるものでもないし、
どんなに対策をしても結局は完全には防げないんですけどねw


一番いいのはマイナンバーなんか廃止するのが一番だと個人的に思いますwww
OSX El Capitan がリリースされて1週間近く経つようですが、我が家のMacbookはまだYosemiteです。

ところで、Windowsの場合はSPが出るまで待ってからアップグレードしてましたが、Macの場合はどうなんでしょうね。

ちょっとググって見たところ、動作が軽くなったといったような情報がポツポツと・・・
あと、日本語入力がスマホみたいに気持ち悪くなったらしいw

もう少し様子を見てTimeMachineでフルバックアップとった後にやってみようかな・・・

ところでこれ何て読むの?
えるきゃぴたん?

OSX El Capitan
久しぶりの更新です。

今更感満載なんですが、フラットデザインぽくしてみました。

まぁ、何というか・・・たいして変わりませんですかねw
相変わらず自分のデザインセンスの無さを痛感しました。

さーて、しばらく忙しくて放置してまいりましたが・・・
いい加減、更新していきたいんです。

でも、また忙しくなるんだろうなぁ・・・ ← 言い訳

あ、Webについて勉強したいと思っていますってもうずいぶん前から言ってますね。
中途半端に調べて放置していたんで、そろそろ本腰入れてHTML5(Javascript)、CSS3あたりを
勉強したいと思っています。
(20年ぐらい前のデザインのほーむぺーじなら作れますよw)

これで何回目の本腰かわかりませんが・・・w

飽きたらcocos2d-xかUnityを勉強してゲームでも作りたいと思います。

それでは・・・
数ヶ月、更新せずに放置してました。

今回の台風は結構すさまじかったですね。
いろんな所で被害が出ています。

更新するきっかけを作るために
あまり需要があるかどうかはありませんが、
台風情報表示のパーツを貼りました。

何か書けるような記事を思いついたら書いて行こうと思いますw
前へ  1 2 3 4 5 6 7  次へ ]      97件中 6-10件