キーワード:プログラミング 解除
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
知っておいたほうが良いと勝手に思っている事をダラダラと書いていこうと思いますw
ただし、あんまり深入りはしません。
経験のない人を対象にしようと思ってますので知ってる人は退屈と
思うかもしれませんが、その時は飛ばしてください・・・w

プログラムなんですが、これはどういうものかと言うと、
コンピューターへの命令の集合みたいなものです。
しかし、コンピューターが実際に実行できる命令は人間にとって
非常にわかりにくく、そのままプログラミングするとなると非常に生産効率が悪いです。

そこで登場するのがプログラミング言語です。
このプログラミング言語は人間にとってよりわかりやすいため、
コンピューターへの命令を記述するのに効率が良いです。

プログラミング言語も、かなり多くの種類がありますので、
実際に開発を行う場合にはその開発に適している言語を選んで開発を行ったりします。

さて、このプログラミング言語ですが困った事に、そのままでは
コンピューターが理解できません。
そのため、コンピューターがわかる命令に翻訳してあげる必要があります。
この翻訳の事をコンパイルと言い、翻訳を行うプログラムをコンパイラと言います。

コンパイラによって翻訳されたプログラムですが、そのままでは実行できません。
そのプログラムで呼び出している他の翻訳されたプログラムやライブラリというプログラムの部品を
結合して、はじめて実行できるプログラムが出来上がります。
この結合する処理をリンクといい、リンクを行うプログラムをリンカ(リンケージエディタ)と言います。

また、コンパイル~リンクまでの処理を行い、実行プログラムを作る処理をビルドと言ったりします。
このビルド(コンパイル~リンク)を単純にコンパイルとだけ言う場合もあります。

ここで言うプログラミング言語で書かれた命令や翻訳されたプログラム、
リンクされたプログラムはWindowsで例えるとこのようになります。

・プログラミング言語で書かれた命令
 → ソースファイル(C言語なら拡張子は.c、C++なら.cpp など)

・コンパイルされて翻訳されたもの
 → オブジェクトファイル(拡張子は.obj : プログラミングした事無い人はあまり見ない拡張子だと思います)
 (ライブラリファイルは.libという拡張子)

・リンクされて実行可能になったもの
 → 実行可能ファイル(拡張子は.exeや.dll など)

ちなみにこのようにプログラミング言語で書かれた命令はコンパイル等の処理が必要になりますが、
世の中にはコンパイルやリンクを行わないでよいプログラミング言語もあります。
いや、正確には実行しながら翻訳していく、といったイメージです。
そのような形式で動かすプログラムをインタプリタと言います。

インタプリタは1行1行を翻訳しながら実行するためコンパイラ方式の言語と比べると処理が遅いです。
しかし、コンパイル・リンクといった作業が不要で直接実行できるためお手軽です。
インタプリタ方式の言語で有名なものは、Perl、PHP、Ruby等です。

また、簡易的なプログラミング言語を全般的にスクリプト言語と言ったりします。
スクリプト言語はインタプリタ方式のものが多いです。
有名なものはjavascriptやVBScript等ですね、もう名前に「Script」がついてますw
また、Unix系OSのシェルに対するシェルスクリプト等もあります。(Windowsでいうバッチファイルのようなもの)

どうでしょうか?なんとなくイメージできますか?
おそらく実際にやってみないとピンとこないかと思います。
なので、ゆっくりと何回にも分けて書いていきたいと思います。

せっかくなんで、次からはオール天草弁で書いてみましょうかね・・・

※間違いや、わかりにくいところは指摘をお願いします。 ←全部?w
何か作れるといいな~と思ったので、書きますw

天草にもコンピューターに詳しく、プログラミングが出来る人が多数いるかと思いますが、
そういう人たちで集まって何か天草発のオープンソースのソフトウェアを作ってみると
面白いかな~と思いました。

どんなソフトウェアにするのか等は全くまだ考えてはないんですがw

プログラミングをやられる方はわかっておられると思いますが、ちょっとしたものを作るのにも
結構時間がかかります。

しかもこれが仕事ではなく、私のように趣味としてやってるとなると暇な時間をみつけて
ちょこちょことしか作れないため、とてもじゃないですがなかなか捗りませんw
(プログラミング能力の影響が大きいかもしれませんが・・・w)

なので、天草のプログラマー(アマチュア・プロどちらも)が集まって何かオープンソースソフトウェアを
作れれば個人で作るよりも良いソフトウェアが生まれるかもしれないと思いました。
また、他の技術者とやりとりする事でもスキルアップもできるという特典もあります!
(というか、私も色々と勉強したいので他人の技術を盗みたいです)

しかし、やってみたいとは思いつつも、現実はなかなか難しいでしょうけどね。。。
誰が取りまとめるとか、どんな感じにやるかとか。
また、完全にボランティアなので強制もできませんからね。(納期は無期限だけどw)

まぁ個人の願望と妄想ですがひとつのアイディアとしてこんなのもいいかな、と思って
記事にしてみました。

ちなみにこのアイディアはオープンソースのLibreOfficeをダウンロード中に思いつきましたw

天草の人でこういうのに興味をもたれたらコメントもらえるとテンションが上がるかもしれませんw
プログラミングを勉強して自分でも何か作ってみたい!
と思っている人もいると思います。

プログラムを作るにはプログラミング言語を勉強しなければなりませんが、
まず何をしますか?
勉強しようと思う言語の基礎からだと思います。

プログラミングは言語にもよりますがネットがあれば
わざわざ入門書なんかを買う必要がないくらい沢山入門サイトがあります。
ただ、入門書は本があるといいかもしれません。
アマゾンなんかで探して評価が良い物を選ぶといいかと思います。
(でも技術書って高いんですよねぇ・・・)

そして、一通り入門書が終わったら(読み終えた、理解してしまった どちらでもいい)
その言語を使って自分が「あったらいいな」と
思うプログラムを実際に自分で作ってみると良いです。
いきなり大掛かりなモノを作るのは絶対に挫折するので
簡単なモノでいいと思います。
「あったらいいな」が無理ならば「こういうのがあれば便利だな」と思う物、
それも難しそうならば数字を入力して計算結果を出力するだけのような
シンプルなものでいいです。
例えるなら「オームの法則」なんかどうでしょう?

抵抗(Ω) = 電圧(V) ÷ 電流(A)

上の公式をプログラムで計算させるんです。

電圧[      ]V
電流[      ]A
   【計算】
抵抗:      Ω

みたいな感じで、電圧と電流を入力させて【計算】ボタンを押すと
抵抗(Ω)が出る、ようなものです。

最初はそういったものを作って色々と弄り倒していけば自然に身についていきます。

ただ、言語もいっぱいあるのでどれを使えばいいかわかりませんね。

どのプラットフォームをターゲットにするかで変わってくると思いますが
こんな感じで言語や開発環境を選ぶといいんじゃないでしょうか?

Windowsアプリ → Visual C#
静的なWebサイト → HTML、CSS
Webアプリ(Webサービス等) → PHP、Javascript
Androidアプリ → Java
iOSアプリ → Objective-C

あと、C言語は覚えておいて損はないです。
ポインタの概念を理解していると他の言語の理解に大いに役立ちます。

HTMLやCSS(スタイルシート)は天草Webの駅のページ外観を変更するのにも使います。
これらはプログラミング言語ではないのでPCを使える人であれば1週間ぐらいで
ある程度は使いこなせるようになると思いますので、興味がある人は
覚えておいて損はないです。

・・・という人も、天草にたくさんいるかと思います。(いてくださいおねがいします)

 

そういう人にオススメなのが、MicrosoftのVisual Studioという開発ツールです。

どこで手に入れればいいかと言うと、アマゾンで購nyMicrosoftのサイトからダウンロードできます。

有料版を買ってもいいのですが、値段見たら笑うしかなくなるので、無料版(Express Edition)を使います。

無料版と言っても、Windowsの.NET Frameworkで動くアプリを作るのには十分すぎるほどなので

初めてGUIプログラミングの勉強するにはもってこいではないでしょうか。

しかも商用利用可能です!

 

バージョンも色々とありますが、ちょっと古いVisual Studio 2010 Expressあたりでもあればいいと思います。

(最新版は何か2013ってのが最近出てるみたいですが・・・)

Webでインストールができますが、DVDのisoイメージとしてもダウンロードが可能です。

30日以上使う場合はプロダクトキーが必要になりますが、ユーザー登録すれば無料で入手できます。

 

Visual Studio 2008はiso板だとユーザー登録しなくてもずっと使えてましたけどね。。。

登録したくない人は2008のiso版がいいかもしれません。(これでも十分な機能です)

 

あと以前、MSDNライブラリのisoイメージがダウンロードできました。(2GB超えてました)

これは何かというと、要はヘルプです。

わからない事があればこいつで使い方なり、関数なりWindowsAPIなり何でも調べられますw

 

では、紹介しますね。

 

・・・と思って探してますが、もう2012しか見つかりませんね。

http://www.microsoft.com/visualstudio/jpn/downloads#d-express-windows-desktop

さすが、マイクロソフト様は古い物はすぐに消してしまうのですね。

 

古いバージョンへのダウンロードファイルへの直リンクがありましたので紹介しときます。

Visual Studio 2008 Express Edition with Service Pack 1

(これはDVDのisoイメージです)

 

Visual Studio 2010 Express Edition

(同じくDVDのisoイメージです)

 

うーん・・・MSDNは見つからなかった。

まぁ、ググればいいかな?www

2014/02/02 あるじゃん!!

 → http://www.microsoft.com/ja-jp/download/details.aspx?id=20955

Visual Studio 2008 SP1のMSDNライブラリです。
DVDのisoイメージで、2.6GBもありますよw

 

言語は3つの中からお好きなのを使ってください。

VC++

VC#

VB

 

オススメなのはVC#です。

.NET Frameworkと相性がいいです(気分的にも)

Javaやってる人は「Javaのパクリやん!!」って思うかもしれませんw

 

あと、VBに慣れてる人(ExcelやAccessなんかでVBAバリバリ使ってる人とか)

ならば、VBが馴染みやすいかもしれないです。

 

.NET Frameworkで動くプログラムを書くのならVC++はあまり使おうとは思いません。

VC++使うならWinAPIでネイティブアプリ書きます。

めんどいですがw

 

まぁ、これは個人的な意見なので後は自分のお好みで・・・w

[ 1 ]      5件中 1-5件