폼을 활성화 하지 않고 표시
음 그러니까 메인폼에서 새로운 폼을 호출 하 되, 포커스는 메인폼에 유지하고 싶을 때를 말한다.
Utility Class
user32.dll 을 임포트하여 Win32API를 이용하는 유틸리티 클래스를 정의한다.
SetVisibleNoActivate 메소드에서 SetWindowPos Win32API를 호출한다. 윈도우 스타일로 SWP_NOACTIVATE 플래그를
지정함으로 구현하는 것 같다.
public static class UtilFuncs
{
[DllImport("user32.dll")]
extern public static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
int x, int y, int cx, int cy, int uFlags);
public const int HWND_TOPMOST = -1; // 0xffff
public const int SWP_NOSIZE = 1; // 0x0001
public const int SWP_NOMOVE = 2; // 0x0002
public const int SWP_NOACTIVATE = 16; // 0x0010
public const int SWP_SHOWWINDOW = 64; // 0x0040
public static void ShowWindowTopMost(IntPtr handle)
{
SetWindowPos(handle, (IntPtr)HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |
SWP_NOMOVE |
SWP_NOACTIVATE |
SWP_SHOWWINDOW );
}
public static void SetVisibleNoActivate(Control control, bool visible )
{
if (visible)
ShowWindowTopMost(control.Handle);
control.Visible = visible;
}
}
폼 비활성화 / 숨기기
위에서 정의한 클래스의 SetVisibleNoActivate 메소드를 호출한다.
폼을 활성화 하지않고 표시
- SetVisibleNoActivate(form, true);
폼을 숨김
- SetVisibleNoActivate(form, false);
private void btnCall_Click(object sender, EventArgs e)
{
Form2 obj = new Form2();
//obj.Show();
//UtilFuncs.SetVisibleNoActivate(obj, false);
UtilFuncs.SetVisibleNoActivate(obj, true);
}
Sample : FormActivateDemo.zip
참조 페이지 : MSDN - Windows Forms FAQ