C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[770] 트레이 영역 강제 갱신.... Remove Dead Icons
박영목 [gsbsoft] 10683 읽음    2008-05-20 11:25
안녕하셨습니까?   사랑합니다.  부산의  월천 박영목입니다.


트레이 영역 강제 갱신.. 죽은 프로세스의 트레이 아이콘 없애기..

NSIS로 Setup 프로그램을 만들어 내부에서 강제로 죽이고 시작하는데 이때 트레이가 있으면
갱신이 되지 않아 2개로 보이지요... 물론 마우스 가면 갱시되지만 조금 지저분해서....
그리고 NSIS에서 메세지를 보내고 응용에서 받고... 찾아야 하고 일도 많이 늘어날 것 같아 계속 이것을 사용하기로 합니다.

2007-04-09 에 델마당에 올린 것인데... 오늘 C++Builder로 할 것이 있어서
볼랜드포름에 찾으려고 하니 없네요.... 제가 이곳에 올려 놓은 줄 알고....

그래서 다시 찾아 C++Builder용으로 만들었습니다.

----------------------------------------------------------------------------------------------------------------------------------------------------

C++Builder로 앞전 프로젝트에서 이 부분 그냥 넘어갔는데... 영 찝찝하여 검색하다가 여기를 찾게 되었는데... 지금 델파이로 코딩 중이라... ㅋㅋㅋ...
아래의 소스를 그대로 하니 저는 잘 안되네요... 그래서 google로 검색헀습니다.

당연히 찾았지요.... ㅋㅋㅋㅋ 이것으로 하니 되네요.... 호호호...
그런데 아래의 소스도 그 사이트에 위쪽에 있고 아래에 이 소스로 답변을 해 두었더군요... 잘 안되시는 분 이것으로 한번 해 보시길.....
부산에서 박영목 어... 전자우편 주소 저것 어떻게 바꾸지요... 저것 옛날 것인데.... 어디서 바꾸는지 아시는 연락요망... gsbsoft@naver.com인데....
--------------------------------------------------------------------------------

>http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21625030.

void __fastcall RemoveDeadIcons()
{
  HWND  wnd;
  TRect rec;
  DWORD w,h;
  DWORD x,y;

  // find a handle of a tray
  wnd = FindWindow( "Shell_TrayWnd", NULL );

  if( wnd!=NULL )
    wnd = FindWindowEx( wnd, 0, "TrayNotifyWnd", NULL );

  if( wnd!=NULL )
    wnd = FindWindowEx( wnd, 0, "SysPager", NULL );

  if( wnd!=NULL )
    wnd = FindWindowEx( wnd, 0, "ToolbarWindow32", NULL );

  // get client rectangle (needed for width and height of tray)

  if( wnd!=NULL )
  {

    ::GetClientRect( wnd, &rec );

    // get size of small icons
    w = (DWORD)GetSystemMetrics(SM_CXSMICON);   //  sm_cxsmicon);
    h = (DWORD)GetSystemMetrics(SM_CYSMICON);   //  sm_cysmicon);

    // initial y position of mouse - half of height of icon
    y = w>>1;
    while( y < (DWORD)rec.Bottom )  // while y < height of tray
    {
      x = h>>1;              // initial x position of mouse - half of width of icon
      while( x < (DWORD)rec.Right ) // while x < width of tray
      {
        SendMessage( wnd, WM_MOUSEMOVE, 0, (y<<16)|x); // simulate moving mouse over an icon
        x = x + w; // add width of icon to x position
      }
      y = y + h; // add height of icon to y position
    }
  }
}

아래는 델파이.......

procedure RemoveDeadIcons;
var
wnd : cardinal;
rec : TRect;
w,h : integer;
x,y : integer;
begin
// find a handle of a tray
wnd := FindWindow('Shell_TrayWnd', nil);
wnd := FindWindowEx(wnd, 0, 'TrayNotifyWnd', nil);
wnd := FindWindowEx(wnd, 0, 'SysPager', nil);
wnd := FindWindowEx(wnd, 0, 'ToolbarWindow32', nil);
// get client rectangle (needed for width and height of tray)
windows.GetClientRect(wnd, rec);
// get size of small icons
w := GetSystemMetrics(sm_cxsmicon);
h := GetSystemMetrics(sm_cysmicon);
// initial y position of mouse - half of height of icon
y := w shr 1;
while y < rec.Bottom do begin // while y < height of tray
x := h shr 1; // initial x position of mouse - half of width of icon
while x < rec.Right do begin // while x < width of tray
SendMessage(wnd, wm_mousemove, 0, y shl 16 or x); // simulate moving mouse over an icon
x := x + w; // add width of icon to x position
end;
y := y + h; // add height of icon to y position
end;
end;
장성호 [nasilso]   2008-05-20 13:42 X
죽은 Icon이 2개 이상일경우에 문제가 있을수 있습니다.

tray에서 MouseMove 메세지를 받았을때 죽은icon을 없애면서
자리를 재 배치해버리잖아요

그래서 죽은 아이콘이 2개 이상일경우에는 두번째 아이콘의 위치에 mousemove 메세지가 가지 않을수도 있더라구요

해결은?
for문으로 while구문을 몇번더 돌리면 되긴합니다
박영목 [gsbsoft]   2008-05-20 21:21 X
장성호님 감사....   ㅋㅋㅋ  새로운 것을 알았습니다.....  행복하세요...^^
댓글이 성호님만 있으니 재미없다... 쩝 ... 담에 더 좋은 것을 구하면 올리겠습니다.
댓글 많이 달아 주세요...   ㅋㅋㅋㅋ  물러갑니다.
지성아빠 [raguru]   2008-05-22 10:25 X
죽은 아이콘이 2개 이상일경우를 위해

x,y의 시작 위치를 0으로.. (빌더 테스트하게..)
박영목 [gsbsoft]   2008-05-22 11:37 X
지성아빠 이곳에서 실력을 발휘해 주기를....  플그림 오래 했으니... 여러가지가 많이 나왔으면 좋겠다.... 델마당도 고수들이 많던데.... C VC를 많이 해서 2달 정도면 아주 잘 할 것이야... C++Builder가 내가 보기에는 막강한 놈이 틀림없음.... ㅋㅋㅋㅋ 수고....
크레브 [kkol]   2008-05-31 09:38 X
아주 쓸만한 팁입니다. ^^ 그리 강제로 죽일 일은 거의 없지만요
프로그램의 완성도를 위해서는 써봐야겠습니다. ㅎㅎ
박영목 [gsbsoft]   2008-06-01 19:26 X
크레브님이 댓글을 주셨네요... ㅋㅋㅋ 감사합니다... 완성도... 이런 것은 사용자에 대한 배려...  사랑이 많다는 느낌이 듭니다... ㅋㅋㅋ   프로그램 잘 하는 사람은 저는 머리가 좋은 사람이 아니라고 생각합니다. 저도 머리가 나빠 기억력 형편없습니다.  남을 배려하는 마음이 많은 사람이 프로그램도 잘한다는 생각을 늘 하고 있습니다. 감사합니다... 바이바이...
장성호 [nasilso]   2008-12-29 00:55 X
트레이에 쓰레기 아이콘 지우는 새로운 방법
http://cafe.naver.com/bcbmaster/939

+ -

관련 글 리스트
770 트레이 영역 강제 갱신.... Remove Dead Icons 박영목 10683 2008/05/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.