マウスクリックに反応せず、その後ろのウィンドウがそのクリックに反応するようなウィンドウを作成したいのですが、

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
natsuno
記事: 7
登録日時: 11年前

マウスクリックに反応せず、その後ろのウィンドウがそのクリックに反応するようなウィンドウを作成したいのですが、

#1

投稿記事 by natsuno » 11年前

windows7で、C++でもC#でも良いです。

画面を表示させて(出来れば枠もなしのを作りたいです。)
画面の内容は見れるのですが、クリックには反応しないようなウィンドウを作りたいです。
さらに、そのウィンドウの後ろのウィンドウ(デスクトップも)にクリックが反応するとなお良いです。
そして、そのウィンドウが常に壁紙の一つ手前に表示されているようにしたいです。
動く壁紙を作れたらいいなと思っております。

方法や関数など、何でもいいのでアイディアがあったら是非教えてもらえると幸いです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: マウスクリックに反応せず、その後ろのウィンドウがそのクリックに反応するようなウィンドウを作成したいのですが、

#2

投稿記事 by みけCAT » 11年前

natsuno さんが書きました:画面を表示させて(出来れば枠もなしのを作りたいです。)
画面の内容は見れるのですが、クリックには反応しないようなウィンドウを作りたいです。
さらに、そのウィンドウの後ろのウィンドウ(デスクトップも)にクリックが反応するとなお良いです。
拡張ウィンドウスタイルにWS_EX_LAYERED | WS_EX_TRANSPARENTを入れると実現できます。
ただし、SetLayeredWindowAttributesで透明度を設定してあげないとウィンドウが見えなくなります。
さらに、これはWindows2000以降専用になります。
枠なしにするには、ウィンドウスタイルにWS_POPUPを加え、CreateWindowExでウィンドウのサイズを指定します。

サンプル

コード:

#define _WIN32_WINNT 0x0500
#include <windows.h>

LPCSTR szWindowClass = "SAMPLE_CLASS";
LPCSTR szWindowTitle = "Sample Application";
LPCSTR szHello = "Hello, Windows C Programming !";

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
                         WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	RECT rt;

	switch (message) {
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				default:
					return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			GetClientRect(hWnd, &rt);
			DrawText(hdc, szHello, lstrlen(szHello), &rt,
					 DT_CENTER | DT_SINGLELINE | DT_VCENTER);
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;
	WNDCLASSEX wcex;
	HWND hWnd;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style          = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc    = (WNDPROC)WndProc;
	wcex.cbClsExtra     = 0;
	wcex.cbWndExtra     = 0;
	wcex.hInstance      = hInstance;
	wcex.hIcon          = LoadIcon(NULL,IDI_APPLICATION);
	wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName   = NULL;
	wcex.lpszClassName  = szWindowClass;
	wcex.hIconSm        = NULL;

	RegisterClassEx(&wcex);

	hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST,
		szWindowClass,
		szWindowTitle, WS_POPUP | WS_SYSMENU | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
		NULL, NULL, hInstance, NULL);

	if (!hWnd) 
		return FALSE;

	SetLayeredWindowAttributes(hWnd,0,128,LWA_ALPHA);
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}
参考サイト
http://msdn.microsoft.com/ja-jp/library/ms997507.aspx
http://www.freeml.com/beginers/515
natsuno さんが書きました:そして、そのウィンドウが常に壁紙の一つ手前に表示されているようにしたいです。
ごめんなさい、ここはよくわからないです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: マウスクリックに反応せず、その後ろのウィンドウがそのクリックに反応するようなウィンドウを作成したいのですが、

#3

投稿記事 by taketoshi » 11年前

壁紙の一つ手前ということは常に一番後ろということでしょうか?

みけさんが提示している透明ウインドウを作成し
WinApiのSetWindowPosを用いて常に一番後ろにウインドウをセットすれば実現できそうな気がします。

参考サイト
http://www.geocities.jp/ky_webid/win32c/061.html

natsuno
記事: 7
登録日時: 11年前

Re: マウスクリックに反応せず、その後ろのウィンドウがそのクリックに反応するようなウィンドウを作成したいのですが、

#4

投稿記事 by natsuno » 11年前

ありがとうございます!感動しています!
CreateWindow()関数しか知らなかったので、そのオプションや後付け設定などを探していましたが、
Exがあったのですね。
サンプルまで、本当にありがとうございます!
ちゃんと壁紙みたくできるかどうか頑張ってみます!

SetWindowPosも良く使い方が分からなかったのですが、やってみます!

ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る