Skip to content


최소화된 폼에 Focus를 주지 않고 깜박거리게 하기.

채팅 프로그램을 개발하면서 여러가지 상황을 만나보게 된다.
채팅창에 글을 적고 있는데 다른 최소화된 대화창에 누군가가 쓴 글이 수신될때 이를 알려줘야하는데 그동안 간단하게 Activate을 사용했었다.
그렇게 되면, 최소화된 창이 Focus되면서 Taskbar에 깜박거리게 된다. 여기까지는 좋았다.
그런데 기존에 열심히 작성하던 채팅 박스가 Focus를 잃게 되면서 글을 작성할 수 없는 상태가 되는 것이다.
그래서 구글링해서 좋은 정보를 찾았다.

폼의 핸들을 찾아서 강제로 깜박거리게 하는 것이다.
관련 소스는 아래와 같다.

public class CFlashWindow
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
[StructLayout(LayoutKind.Sequential)]
private struct FLASHWINFO
{
///
/// The size of the structure in bytes.
///
public uint cbSize;
///
/// A Handle to the Window to be Flashed. The window can be either opened or minimized.
///
public IntPtr hwnd;
///
/// The Flash Status.
///
public uint dwFlags;
///
/// The number of times to Flash the window.
///
public uint uCount;
///
/// The rate at which the Window is to be flashed, in milliseconds. If Zero, the function uses the default cursor blink rate.
///
public uint dwTimeout;
}
///
/// Stop flashing. The system restores the window to its original stae.
///
public const uint FLASHW_STOP = 0;

///
/// Flash the window caption.
///
public const uint FLASHW_CAPTION = 1;

///
/// Flash the taskbar button.
///
public const uint FLASHW_TRAY = 2;

///
/// Flash both the window caption and taskbar button.
/// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
///
public const uint FLASHW_ALL = 3;
///
/// Flash continuously, until the FLASHW_STOP flag is set.
///
public const uint FLASHW_TIMER = 4;
///
/// Flash continuously until the window comes to the foreground.
///
public const uint FLASHW_TIMERNOFG = 12;

///
/// Flash the spacified Window (Form) until it recieves focus.
///
///The Form (Window) to Flash. ///
public static bool Flash(System.Windows.Forms.Form form)
{
// Make sure we're running under Windows 2000 or later
if (Win2000OrLater)
{
FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0);
return FlashWindowEx(ref fi);
}
return false;
}
private static FLASHWINFO Create_FLASHWINFO(IntPtr handle, uint flags, uint count, uint timeout)
{
FLASHWINFO fi = new FLASHWINFO();
fi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fi));
fi.hwnd = handle;
fi.dwFlags = flags;
fi.uCount = count;
fi.dwTimeout = timeout;
return fi;
}
///
/// Flash the specified Window (form) for the specified number of times
///
///The Form (Window) to Flash. ///The number of times to Flash. ///
public static bool Flash(System.Windows.Forms.Form form, uint count)
{
if (Win2000OrLater)
{
FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL, count, 0);
return FlashWindowEx(ref fi);
}
return false;
}
///
/// Start Flashing the specified Window (form)
///
///The Form (Window) to Flash. ///
public static bool Start(System.Windows.Forms.Form form)
{
if (Win2000OrLater)
{
FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL, uint.MaxValue, 0);
return FlashWindowEx(ref fi);
}
return false;
}
///
/// Stop Flashing the specified Window (form)
///
//////
public static bool Stop(System.Windows.Forms.Form form)
{
if (Win2000OrLater)
{
FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_STOP, uint.MaxValue, 0);
return FlashWindowEx(ref fi);
}
return false;
}
///
/// A boolean value indicating whether the application is running on Windows 2000 or later.
///
private static bool Win2000OrLater
{
get { return System.Environment.OSVersion.Version.Major >= 5; }
}
}

위와 같이 하고 사용은 아래와 같이한다.

// 폼이 포커스를 갖게되기전까지 계속 깜박거림
FlashWindow.Flash(this);

// 5초간 계속 깜박거림
FlashWindow.Flash(this, 5);

// 강제로 깜박거리게 하는 시작
FlashWindow.Start(this);

// 강제깜박인 중지
FlashWindow.Stop(this);

Posted in C# - 채팅 프로그램, 개발과 나.


메달오브아너 티어1 – 전쟁이란…


EA의 메달 시리즈 최신작.. 메달오브아너 티어1…
일단 수작은 수작이다.


먼저 인증샷!!!(게임은 구매해서…)


(한글화된 게임… 물론 유저 한글화다.)

음… 나름 기대하지 않았던 게임인데 정말 재미있게 플레이했다.
특히 유저 한글화가 잘 되어있어 몰입도도 상당했음. 군사용어가 많아서 어렵지는 않았을까? 들리는 이야기로는 여기 번역팀에 참여한 분 중에 한 사람이 미군에서 근무했었다는…

그래픽 엔진은 요즘 대세인 프로스트바이트 엔진을 사용했다. 물론 FB2가 아닌 FB…
좀 예전 게임이라… 그래도 꽤 봐줄만한 퀄러티의 그래픽을 자랑한다.
실화를 바탕으로 했다고해서 더더욱더 몰입이 좋았고, 특히나 스토리가 정말 맘에 들었다.


(동굴 입구로 들어가다 총에 맞는 동료…)

마지막 엔딩때는.. 정말이지.. 아~…
기운빠지는 한숨만…(스포는 여기까지..)

암튼 꽤 근사한 작품이었다. 나의 평점은… 8

스 토 리 : 9
그 래 픽 : 7
사 운 드 : 8
게 임 성 : 8
종   합 : 8

추천작중에 하나이다. 구매는 오리진에서…

Posted in PC Game, 나의 게임들, 이런 저런 이야기들.


십자군 이야기2 – 예루살렘 탈환 그 이후

28000000652021

십자군 이야기 1을 읽고 부랴부랴 십자군 이야기2을 사서 읽었다.

십자군 이야기 1의 내용이 십자군의 성지(예루살렘) 탈환이었다면 십자군 이야기2는 탈환 이후의 십자군 국가가 어떻게 유지했는가를 담고 있었다.

십자군의 성지 탈환 이후, 예루살렘 왕이 된 고드푸아르는 성지 탈환에 힘을 썼던 탄크레디 등과 함께 예루살렘 근처의 도시들을 정벌하며 공격 아닌 수비를 하게 되었다. 그것이 최선의 방어라고 생각했고, 역사적으로 보더라도 올바른 결정이었다.

그 결과 십자군 국가는 총 3개의 도시국가가 탄생되었다. 예루살렘 왕국, 안티오키아령, 트리폴리령. 이 3개의 도시국가 형태의 나라는 각각의 영주가 다스리고 있지만, 그 중심에는 예루살렘 왕국이 있었다.

중세 유럽의 국가 형태처는 봉건제도 였는데 이 십자군 국가도 동일한 형태였던 것이다. 3개의 자치령들은 서로 연합하여 각각의 영내의 방어를 서로 도와갔던 것이다.

그러나 1차 십자군의 영웅들도 이런저런 이유로 죽고, 수비의 수적이 열세로 나타난 것이 바로 십자군의 성채이다. 성채는 십자군 국가 전역에 세워졌는데 그 수가 무려 100개이상이었다고 한다. 정말 나중에 한번 꼭 탐문해보고 싶다. 특히 책에서 자주 나왔던 성채인 ‘크락 데 슈발리에’라는 성채는 꼭 한번 가서 보고 싶어졌다. 대략 1000여명이 수비를 위해서 존재했었다고 하는 성채의 위력 때문에 이슬람의 공격에도 쉽게 방어할 수 있었던 것이다.

교황 우르바누스 2세의 ‘신이 바라신다’라는 외침으로 시작된 십자군 전쟁. 그 교황이 죽고 십자군의 중심이 사라졌던 시기에 한 성직자 베르나르두스에 의해 2차 십자군이 결성된다. 2차 십자군은 1차와는 다르게 제후(왕의 친척)들이 아닌 왕들이 직접 참가했다. 루이 7세(프랑스), 콘라트(신성로마제국 황제 – 독일)가 참여했다. 그런데 1차 십자군의 군사력보다 덜 했다고 한다. 물론, 점령 전쟁과 수비 전쟁의 차이 때문이었을 것이다. 특히 루이 7세의 프랑스 군에는 엘레오노르라는 루이 7세의 부인도 같이 참여했다고 한다. 엘레오노르는 여전사들과 같이 참전했다고 하는데 이 여자는 프랑스의 1/3의 영토의 주인이었다고 한다. 여자의 힘은 중세에 굉장했다고 하던데 정말 그랬나보다.

2차 십자군은 이슬람의 2번째 영웅(십자군 당시의… 첫번째는 ‘장기’라는 장수)인 누레딘에 의해 무참이 패배하고 그냥 돌아간다. 오직 예루살렘에 왔다가는 순례자들처럼 말이다. 참고로 다시 돌아간 루이7세의 부인인 엘레오노르는 이런 루이 7세의 소극적인 태도와 남자답지 못한 자신의 남편을 보고 실망하여 이혼하게 된다. 그 당시에는 이혼의 허락되지 않던 시절이기에 그들의 결혼을 무효화했다고 한다. 물론 교황의 결정이었다. 그 엘레오노르는 위풍당당하고 남자다운 앙리 2세와 재혼하게 되는데 그러면서 그녀의 땅(프랑스의 1/3)이 앙리2세(영국)의 수중으로 들어가게 된다. 바로 이 문제로 영국과 프랑스의 영토 분쟁 전쟁인 100년 전쟁이 시작되게 된다.

생각해보면, 결국 여자 때문에… -..- 그리고 십자군 전쟁 때문에… 발발한 100년 전쟁. 정말 중세에는 여자들의 파워와 남자다움, 기사도 등이 중요했던 시절이었나보다.

기대했던 십자군 국가들도 그들의 조기 귀환으로 실망에 빠질 수 밖에 없었다. 또한, 2차 십자군 원정대는 이슬람 국가들에게 큰 선물을 남기고 갔다. 바로, 자신감이었다. 그 전까지는 중무장한 유럼의 군사들에 대해서 알게 모르게 이길 수 없는 군대라는 패배주의에 빠져있었을 것이다. 하지만, 그들은 2차 원정대에 대한 큰 승리로 자신감을 얻었다. 충분히 이길 수 있는 상대라는 것을 알게 된 것이다.

이렇게 어려운 상황에서 나온 것이 바로 누구나 한번 들어봤을 법한 ‘템플 기사단’이다. 물론 귀족들이 중심이된 ‘병원 기사단’도 동일한 시기에 탄생했다고 한다. 템플 기사단은 가장 세력이 컸을때도 500명이 안되었다고 한다. 그 이유는 그들이 전장에 나가서 싸우게 되면 죽는 것, 아니면 포로로 잡혀가는 것이었지만, 포로로 잡혀가더라도 절대 몸값을 지불한다고 하더라도 그들은 죽기를 청했다고 한다. 모두 엄청난 신자들이었던 것이다. 그들이야말로 질럿(광신도)이 아니었을까?

다시 십자군 국가로 돌아와서… 십자군 국가들은 점점 더 어려워졌다. 그래도 그들은 매년, 아니 매주마다 전쟁터로 나가서 수비전을 벌였다고 한다. 그리고 이슬람의 또 다른 영웅이 나오게 된다. 바로 살라딘이었다.

난 몇몇 그의 이름을 들어봤다. 영황에서, 책에서, 어떤이의 블로그에서… 그러나 그의 존재에 대해서 잘 알지는 못했다. 그 만큼 이슬람 문화권에 대한 정보가 너무 상대적으로 빈약했던 탓이 아닐까?

십자군 이야기 2권은 1권보다 더 다양한 내용을 담고 있다. 1권은 1차 십자군 원정대의 예루살람 탈환까지의 전쟁들을 담았다면, 2권은 그 이후의 다양한 주변 정세와 2차 십자군 원정대의 실패, 그리고 이슬람의 반격을 담고 있다.

2권에 대한 독후감과 짧은 기록 정리를 한 포스트에 하려고 했는데 의외로 양이 많아져서 몇개로 나누어야 할 듯하다.

다음에는 살라딘과 이슬람의 지하드, 그리고 이슬람과 그리스도의 당시의 문화적 차이들에 대해서 남겨보겠다.

Posted in 독후감, 이런 저런 이야기들.

Tagged with , , .




© 2009-2012 Life is Game All Rights Reserved