adsense728x90


DestroyWindow 실험 Computers

 
DestroyWindow가 다른 thread에는 적용되지 않는다.

다른 process의 window를 죽이려고 시도해봤고,
같은 process에서 thread를 만들어서 window를 죽이려고 시도해 봤다.
덕분에, win32로 thread 만드는 연습만 한 번 한 셈.

윽 msdn에 이미 나온 내용이네. -_-

Remarks

A thread cannot use DestroyWindow to destroy a window created by a different thread.

If the window being destroyed is a child window that does not have the WS_EX_NOPARENTNOTIFY style, a WM_PARENTNOTIFY message is sent to the parent.


읽고 보니, 전에 한 번 읽고서 물론 그러겠거니 했던 기억이 난다.
에휴.

PostMessage 로 WM_QUIT 을 보내는 건 잘 된다.
다른 process도 잘 죽인다. 이래도 되나?

msdn에는 PostMessage 쓰지 말고, PostQuitMessage를 쓰라고 돼있지만.


thread 만들기는 http://www.codersource.net/win32_multithreading.html code를 참고했다.
출력할 때는 OutputDebugString 을 썼다.
char* 안쓰고, LP뭐시기 쓰는 거 짜증난다. API도 잘 몰라서.
wsprintf 랑 TCHAR* 를 썼다.



Window handle은 FindWindow로 찾았다.

 case WM_LBUTTONDOWN:
  //targetWindow = FindWindow(NULL, L"DestroiedWindowTest");
  targetWindow = FindWindow(NULL, L"Thread Window");
  if(!DestroyWindow(targetWindow))
   MessageBox(hWnd, L"Cant", L"caption", 0);
  else
   MessageBox(hWnd, L"Ok.", L"caption", 0);
  break;
 case WM_RBUTTONDOWN:
  //targetWindow = FindWindow(NULL, L"DestroiedWindowTest");
  targetWindow = FindWindow(NULL, L"Thread Window");
  if (!PostMessage(targetWindow, WM_DESTROY, NULL, NULL))
   MessageBox(hWnd, L"Cant post", L"caption", 0);
  else
   MessageBox(hWnd, L"Posted", L"caption", 0);
  break;


IDM_ABOUT 에 CreateThread를 넣었다.

  case IDM_ABOUT:
   DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
   DWORD dwGenericThread;
   TCHAR lszThreadParam[3];
   wsprintf(lszThreadParam, L"%d", 3);
   hThread = CreateThread(NULL, 0,
    StartThread, &lszThreadParam,
    0, &dwGenericThread);



같은 역할을 하는 window를 만들었다.

DWORD WINAPI StartThread(LPVOID iValue)
{
 //TCHAR lszParam[3];
 //strcpy((char*)lszParam, iValue);
 //int iStart = atoi(lszParam);
 //for (int i = iStart; i <= iStart+2; i++)
  OutputDebugString((LPCWSTR)iValue);
  HWND hWnd = CreateWindow(szWindowClass, L"Thread Window", WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);
  if (!hWnd)
   OutputDebugString(L"Cant CreateWindow");
  ShowWindow(hWnd, SW_SHOW);
  UpdateWindow(hWnd);
  

 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {
  //if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

 OutputDebugString(L"Thread end");
 return (int) msg.wParam;
 
}


덧글

댓글 입력 영역
◀ 다음덧글    이전덧글 ▶