Doputer

Color Picker ํ”„๋กœ์ ํŠธ๐ŸŽจ

MFC ํ† ์ด ํ”„๋กœ์ ํŠธ

ํ•™๊ต์—์„œ ๊ณ„์ ˆํ•™๊ธฐ ๊ฐ•์˜๋กœ MFC ์ˆ˜์—…์„ ๋“ค์œผ๋ฉด์„œ C++ MFC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ MySQL์„ ์ด์šฉํ•ด์„œ ๋„์„œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค. ์ฒ˜์Œ์— MFC๊ฐ€ ๋˜๊ฒŒ ๋ณต์žกํ•˜๋‹ค๊ณ  ๋Š๊ปด์ ธ์„œ ๊ด€๋‘๊ณ  ์‹ถ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ๋‚˜๋ฆ„ ํ• ๋งŒํ–ˆ๋‹ค. ์˜ˆ์ „์— Java Swing์œผ๋กœ ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋„ ์ƒ๊ฐ๋‚˜๊ณ  ๊ทธ๋•Œ๋ณด๋‹ค ํŽธํ•œ ์ ๋„ ๋งŽ์ด ๋Š๊ผˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ƒ์—์„œ ๋ทฐ ํ™”๋ฉด์„ ํ†ตํ•ด ์ปจํŠธ๋กค๋“ค์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜(๋ฌผ๋ก  Java Swing WindowBuilder๋‚˜ JavaFX SceneBuilder๊ฐ€ ์žˆ์ง€๋งŒ ๋‹น์‹œ์— ์‚ฌ์šฉ์„ ์•ˆํ–ˆ๋‹ค), ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒŒ ๊ฐ„ํŽธํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋‚˜๋ฆ„ MFC์˜ ๋งค๋ ฅ์„ ๋Š๋ผ๋ฉด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋งˆ์ณค๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ์‹œ์ž‘๋œ ํ”„๋กœ์ ํŠธ

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ์˜ˆ์ „์— ์–ผํ• ์ƒ๊ฐํ–ˆ๋˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ถ€๋ถ„์˜ ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. PPT๋‚˜ ํ”„๋กœ๊ทธ๋žจ UI๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ„ํ˜น ๊ดœ์ฐฎ์€ ์ƒ‰์ƒ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๋‹ต๋‹ตํ–ˆ๋˜ ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ MFC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์šด ๊น€์— ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ

๋ฉ”์ธ ํ™”๋ฉด๊ณผ Pick ํ™”๋ฉด

UI๋Š” ์œ„์— ๋‚˜์™€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์ƒํ–ˆ๋‹ค. ๋ฉ”์ธ ํ™”๋ฉด์—์„œ Pick ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์˜ค๋ฅธ์ชฝ Pick ํ™”๋ฉด์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , Pick ํ™”๋ฉด์€ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋ฉด์„œ ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ๊ณณ์˜ ์ƒ‰์ƒ ์ •๋ณด๋ฅผ RGB ํ˜•์‹์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ–ˆ๋‹ค. ์ปค์„œ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์œ„์น˜์˜ ์ƒ‰์ƒ ์ •๋ณด๊ฐ€ ๋ฉ”์ธ ํ™”๋ฉด์— ๋ฟŒ๋ ค์ง€๊ฒŒ ๋˜๊ณ , Copy๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด HEX ๊ฐ’์œผ๋กœ ์ƒ‰์ƒ ์ •๋ณด๊ฐ€ ๋ณต์‚ฌ๋˜๊ฒŒ ํ–ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํด๋ฆญ์„ ํ†ตํ•ด์„œ ์ƒ‰์ƒ ์ •๋ณด๋งŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์‹œ๊ฐ„ ์ •๋„ ํˆฌ์žํ•˜๋ฉด ์™„์„ฑํ•  ์ค„ ์•Œ์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌด๋ ค ํ•˜๋ฃจ๋‚˜ ๊ฑธ๋ ธ๋‹ค!

 

ํ•˜๋ฃจ๋‚˜ ๊ฑธ๋ฆฐ ์ด์œ 

์šฐ์„  ๋งˆ์šฐ์Šค ์ปค์„œ์— ์œ„์น˜ํ•œ ์ƒ‰์ƒ ์ •๋ณด๋Š” ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ–ˆ๋‹ค.

colorDlg->SetWindowPos(NULL, pMouse->pt.x + 5, pMouse->pt.y + 5, 0, 0, SWP_NOSIZE);

COLORREF color = GetPixel(GetDesktopWindow()->GetDC()->GetSafeHdc(), pMouse->pt.x, pMouse->pt.y);
colorDlg->color = color;

 

๊ทธ๋Ÿฐ๋ฐ ์ปค์„œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฒ—์–ด๋‚˜๋Š” ์ˆœ๊ฐ„ ๋” ์ด์ƒ ์ปค์„œ์— ํ•ด๋‹นํ•˜๋Š” ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ดค๋‹ค.

 

  1. SetCapture(), ReleaseCapture()
    ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆ์šฐ์Šค๊ฐ€ ๋‹ค์ด์–ผ๋กœ๊ทธ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋„ ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค๋งŒ, ๋งˆ์šฐ์Šค๊ฐ€ ๋‹ค์ด์–ผ๋กœ๊ทธ ์•ˆ์—์„œ ๋ˆŒ๋ฆฐ ์ƒํƒœ๋กœ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ๋งŒ ๋งˆ์šฐ์Šค ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์•˜๋‹ค. ๋‹ค์ด์–ผ๋กœ๊ทธ ๋ฐ–์—์„œ ํด๋ฆญํ–ˆ์„ ๋•Œ ์›ํ•˜๋Š” ์œ„์น˜์˜ ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  2. ์ „์ฒด ํ™”๋ฉด(SW_MAXIMIZE)๊ณผ ๋ฐฐ๊ฒฝ ํˆฌ๋ช…ํ™”(transparent)
    ๋ฉ”์ธ ํ™”๋ฉด์—์„œ Pick์„ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„ ๋ฉ”์ธ ํ™”๋ฉด์„ ์ „์ฒด ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ฐฐ๊ฒฝ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ํ•ด์„œ ๋งˆ์šฐ์Šค ์ปค์„œ๊ฐ€ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ๋Œ€๋กœ ๋™์ž‘ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Pick ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ™”๋ฉด์ด ์ตœ๋Œ€ํ™” ๋˜๊ณ , ํ™”๋ฉด์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์›๋ž˜ ํฌ๊ธฐ๋กœ ๋Œ์•„์˜ค๋ฉด์„œ ๋™์ž‘์ด ๋งค์šฐ ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์› ๋‹ค. ํ™”๋ฉด์ด ๊นœ๋นก๊ฑฐ๋ฆฌ๊ณ , ์ƒ‰์„ ๊ณ ๋ฅผ ๋•Œ ๋”ฐ๋ผ์˜ค๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ์˜ ์›€์ง์ž„๋„ ๋ณด๊ธฐ ์•ˆ์ข‹์•˜๋‹ค.

ํ™”๋ฉด์ด ๊นœ๋นก๊ฑฐ๋ฆฌ๊ณ , ๋™์ž‘์ด ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๋‹ค

๋” ์ด์ƒ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์—ฌ๊ธฐ์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ• ๊นŒํ•˜๋‹ค๊ฐ€ ๋„ˆ๋ฌด ์ฐœ์ฐœํ•ด์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด๋ดค๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํ›„ํ‚น(hooking)์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

ํ›„ํ‚น(Hooking)

[๊ฐ์ฃผ:1]ํ›„ํ‚น(hooking)์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์šฉ์–ด๋กœ, ์šด์˜ ์ฒด์ œ๋‚˜ ์‘์šฉ ์†Œํ”„ํŠธ์›จ์–ด ๋“ฑ์˜ ๊ฐ์ข… ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์— ๋ฐœ์ƒํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ, ๋ฉ”์‹œ์ง€, ์ด๋ฒคํŠธ ๋“ฑ์„ ์ค‘๊ฐ„์—์„œ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๊ฐ€๋กœ์ฑ„๋Š” ๋ช…๋ น, ๋ฐฉ๋ฒ•, ๊ธฐ์ˆ ์ด๋‚˜ ํ–‰์œ„๋ฅผ ๋งํ•œ๋‹ค.

์ „์—ญ ํ›„ํ‚น์„ ์ด์šฉํ•˜๋ฉด ํ›…์ด ๊ฑธ๋ ค์žˆ๋Š” ๋™์•ˆ ๋ชจ๋“  ๋งˆ์šฐ์Šค๋‚˜ ํ‚ค๋ณด๋“œ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ค‘๊ฐ„์— ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ์ค„ ๋ชฐ๋ž๊ณ , ์•Œ๊ฒŒ ๋˜์–ด์„œ ๋„ˆ๋ฌด ์ข‹์•˜๋‹ค.

// SetHook
g_hModule = GetModuleHandle(NULL);
if (NULL != g_hModule)
{
	g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, g_hModule, NULL);
}

if (NULL == g_hMouse)
	AfxMessageBox(_T("Mouse Hook Fail"));

// UnHook
BOOL bMouseUnHook = UnhookWindowsHookEx(g_hMouse);

if (TRUE == bMouseUnHook)
{
	g_hMouse = NULL;

	FreeLibrary(g_hModule);
	g_hModule = NULL;
}

Pick ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด SetHook ํ†ตํ•ด์„œ ํ›„ํ‚น์„ ํ–ˆ๊ณ , ์ƒ‰ ์„ ํƒ์ด ์™„๋ฃŒ๋˜๋ฉด UnHook์„ ํ†ตํ•ด์„œ ํ›„ํ‚น์„ ํ•ด์ œํ–ˆ๋‹ค. UnHook์„ ํ•˜์ง€ ์•Š์œผ๋ฉด Pick ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํ›„ํ‚น์„ ํ•ด์„œ ์œˆ๋„์šฐ ์ž์ฒด๊ฐ€ ๋Š๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ UnHook์„ ํ•ด์คฌ๋‹ค. ์‚ฌ์‹ค ์ง€๊ธˆ ์‚ฌ์šฉํ•œ ํ›„ํ‚น์€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋‹จ๊ณ„์— ํ›„ํ‚น์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜๋„ ๋‚ด๊ฐ€ ์„ค๊ณ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค. ๋‚˜์ค‘์— ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ๋‹ค๋ฅธ ํ›„ํ‚น๋„ ํ•œ๋ฒˆ ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

 

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๊ณ„ํšํ–ˆ๋˜ ํ”„๋กœ๊ทธ๋žจ๋Œ€๋กœ ์™„์„ฑ์ด ๋˜์—ˆ๊ณ , ๋ฒ„๋ฒ…์ž„ ์—†์ด ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค. ํ•˜๋ฃจ ๋™์•ˆ ์ง„ํ–‰ํ•œ ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.

Pick๊ณผ Copy๊ฐ€ ์ž˜ ๋™์ž‘ํ•œ๋‹ค

 

์†Œ์Šค์ฝ”๋“œ

https://github.com/doputer/ColorPicker

 

doputer/ColorPicker

Contribute to doputer/ColorPicker development by creating an account on GitHub.

github.com

 

๋‹ค์šด๋กœ๋“œ

ColorPicker.exe
0.04MB

 

๋ฐ˜์‘ํ˜•

์ด ๊ธ€์˜ ํƒœ๊ทธ

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Doputer

#๊น€๋„ํ˜„

ํ™œ๋™ํ•˜๊ธฐ