ページ 11

スクリーンキャプチャソフトの自作

Posted: 2014年11月27日(木) 21:49
by CoCoさん
Gyazo(https://gyazo.com/ja)のようなソフトを作ろうとしています。

アプリの仕様としては、
①マウスドラックで範囲指定し、その範囲をスクリーンキャプチャします。
②アプリを起動すると撮影と保存ボタンを描画しているウィンドウが作成されます。
③撮影ボタンを押すとウィンドウを隠し、マウスポインタが十字になって範囲指定モードになる。
④範囲指定モード中は他のアプリケーションやデスクトップアイコンは押せない。
⑤範囲指定後、ディスプレイのデバイスコンテキストを取得し撮影する。
⑥撮影を終えると再びアプリウィンドウが表示され撮影した画像が表示される。
⑦保存ボタンを押すと任意のフォルダに画像を保存。

こんな感じにしたいです。
⑤以降の処理はいいのですが、③と④の処理をどうしようか考えています。
使えそうなAPI関数を教えてください。

現在ここまでしか書けていません。

コード:

switch(msg)
{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;

	case WM_CREATE:
		upload_button = CreateWindow(TEXT("BUTTON"),TEXT("保存"), DS_CENTER | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,490,405,120,30,hwnd,(HMENU)IDM_UPLOAD_BUTTON,((LPCREATESTRUCT)(lp))->hInstance,NULL);
		shot_button = CreateWindow(TEXT("BUTTON"),TEXT("撮影"), DS_CENTER | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,430,405,50,30,hwnd,(HMENU)IDM_SHOT_BUTTON,((LPCREATESTRUCT)(lp))->hInstance,NULL);

		EnableWindow(upload_button,FALSE);

		SetCursor(LoadCursor(NULL,IDC_ARROW));
		break;

	case WM_LBUTTONDOWN:
		on_x = LOWORD(lp);
		on_y = HIWORD(lp);
		break;

	case WM_LBUTTONUP:
		up_x = LOWORD(lp);
		up_y = HIWORD(lp);

		sprintf(str,"%d:%d-%d:%d",on_x,on_y,up_x,up_y);

		EnableWindow(upload_button,TRUE);
		EnableWindow(shot_button,TRUE);

		MessageBox(NULL,str,TEXT("test"),MB_OK);
		break;

	case WM_COMMAND:
		switch(LOWORD(wp))
		{
			case IDM_EXIT:
				PostQuitMessage(0);
				break;

			case IDM_USE:
				ShellExecute(hwnd,"open","http://",NULL,NULL,SW_SHOWNORMAL);
				break;

			case IDM_VERSION:
				DialogBox(hInst1,MAKEINTRESOURCE(IDD_VERSION_DIALOG),hwnd,DialogProc_VERSION);
				break;

			case IDM_UPLOAD_BUTTON:
				break;

			case IDM_SHOT_BUTTON:
				EnableWindow(shot_button,FALSE);
				SetCursor(LoadCursor(NULL,IDC_CROSS));
				break;
		}
		break;
}
開発環境 : VC++2010
使用言語 : C言語
使用API : Win32API

Re: スクリーンキャプチャソフトの自作

Posted: 2014年11月27日(木) 21:54
by h2so5
Gyazoのソースを見たほうが早いと思います。

Re: スクリーンキャプチャソフトの自作

Posted: 2014年11月29日(土) 20:13
by CoCoさん
Gyazoがオープンソースだったこと知りませんでした。

現在③でウィンドウを消すことはできたのですが、思うような動作をしません。
ソースが長くなるので他サイトのアップローダーにzipでアップしときました。
http://fast-uploader.com/start/6972814970294/
ラバーバンドの描画や、ウィンドウを透明にした後の画面のチラつき、Escによる撮影モード解除、マウスのキャプチャ
このあたりがどうにもなりません。

よろしくお願いします。

Re: スクリーンキャプチャソフトの自作

Posted: 2014年12月09日(火) 19:47
by CoCoさん
http://fast-uploader.com/file/6973677465720/
とりあえずソース一式と実行ファイルをアップロードしました。
パスワードは57630です。
いくつかの問題が解決できないため、よろしくお願いします。


【質問①】
IDM_SHOT_BUTTONメッセージ(撮影ボタンが押されたとき)の処理で
現在のウィンドウを透明化にし、ウィンドウ作成時のサイズをスクリーンサイズにリサイズしています。
このとき、リサイズ前に他のウィンドウと被ってた場所が白くなってしまいます。

【質問②】
ウィンドウをウィンドウ作成時のサイズに戻す処理(Escキー検知やマウスの左ボタンがはなされたとき)他のウィンドウ以外(デスクトップ)が白くなってます。

【質問③】
マウスの左ボタンが押されたときに透明なはずのウィンドウにメニューバーがグレーになって浮き出てきます。

【質問④】
同じくマウスの左ボタンが押されたときWM_MOUSEMOVEのメッセージが送られるようになって、その中(厳密には別関数での処理)で透明なレイヤーウィンドウを表示しているのですが、このレイヤーウィンドウもグレーになって浮き出てきます。

【質問⑤】
上記質問④のレイヤーではスクリーンに線を描画しているのですが、
初回はちゃんと線が描画されますが、二回目以降は線が出てきません