





ChangeWindowMessageFilter 함수를 이용하여 해결하였으나,
추후 윈도우 버젼에서는 지원하지 않는 관계로 ChangeWindowMessageFilterEx 함수를 사용.
[ Using the ChangeWindowMessageFilter function is not recommended, as it has process-wide scope. Instead, use the ChangeWindowMessageFilterEx function to control access to specific windows as needed. ChangeWindowMessageFilter may not be supported in future versions of Windows.]
BOOL CRedundantMonDlg::OnInitDialog(){CDialog::OnInitDialog();// Release : 1.2.3.13 (2015년 8월 26일 수요일)DragAcceptFiles(true); // To Accept Dropped file Set this TRUEChangeWindowMessageFilterEx(m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL);ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL);ChangeWindowMessageFilterEx(m_hWnd, 0x0049, MSGFLT_ALLOW, NULL);// ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);// ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);// ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);
1. AVD 에뮬레이터 윈도우 선택(마우스 클릭)2. ALT + SPACE3. 팝업메뉴에서 "이동" 선택4. 키보드의 화살표 키를 이용하여 원하는 곳으로 이동(종료:엔터)5. 제목표시줄이 보이면 마우스로 잡아서 이동(종료:클릭)
FindWindow: 윈도우 찾기
HWND FindWindow(
LPCTSTR lpClassName, //클래스명 (NULL 시 모든 클래스조사)
LPCTSTR lpWindowName //윈도우 캡션명만 사용가능 (NULL 시모든 윈도우 캡션 검색)
);
FindWindowEx: 윈도우 자세히 찾기(부모 윈도우의 자식윈도우 찾기 기능 포함)
HWND FindWindowEx(
HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
hwndParent와 hwndChildAfter가 NULL 일 경우는 FindWindow와 동일
Parameters
hwndParent : 찾고자 한는 자식윈도우의 부모윈도우 핸들
hwndChildAfter : 찾기 시작할 자식윈도우 핸들 – 해당 자식윈도우 핸들의 다음 순번부터 찾기 시작함.
lpszClass : 클래스명.NULL 시 모든 클래스명 비교.
lpszWindow : 윈도우 제목(캡션). NULL 시 모든 윈도우명 비교.
클래스명 참고자료 : https://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx
| Class | Description |
| ComboLBox | The class for the list box contained in a combo box. |
| DDEMLEvent | The class for Dynamic Data Exchange Management Library (DDEML) events. |
| Message | The class for a message-only window. |
| #32768 | The class for a menu. |
| #32769 | The class for the desktop window. |
| #32770 | The class for a dialog box. |
| #32771 | The class for the task switch window. |
| #32772 | The class for icon titles. |
기본 진행순서
1. FindWindow를 이용하여 다른 프로그램의 콘트롤 핸들을구한다.
2. 메시지를 전달한다.
예외사항
캡션바가 없는 대화상자이며, 메인 대화상자에서 Modal이 아닌 Modaless로 동적 생성된 대화상자이다.
SPY++을 통해 조사해 보니 캡션은 “”, 클래스명은 #32770임. 또한전체 윈도우를 검색해 보니 동일한 조건의 윈도우가 여러 개 있음.
FindWindow를 사용할 수 없음.
여러가지 조건을 만들어서 구현(부모윈도우의 핸들은 구할 수 있으므로이를 이용)
LRESULTCBarcodeScannerDlg::OnBarCodeReadHandy(WPARAM wParam, LPARAM lParam)
{
CStringstrSerial;
strSerial.Format("%s",g_szHandyReceiveBuffer);
CStringstrSerialText;
strSerialText.Format("%s",strSerial);
SetDlgItemText(IDC_EDIT_DATA, strSerialText );
// 캡션명이없는 대화상자를 찾는다.
HWNDhWndNext = ::FindWindowEx(NULL, NULL, "#32770", "");
// 부모윈도우의 캡션을 이용하여 핸들을 구한다.
// 만약부모 윈도우 캡션마저 없다면, 자식윈도우가 가지고 있는 컨트롤들의ID와 비교.
HWNDhWndMain = ::FindWindow(NULL,"DCU Monitoring S/W");
while(hWndNext )
{
//캡션명이 없는 대화상자의 부모를 찾는다.
CWnd* pWnd = CWnd::FromHandle(hWndNext)->GetParent();
//알고 있는 ID를 비교하여 일치하지 않을 경우는 계속해서 다음 윈도우를 찾음.
//두 번째 인자 이후부터 찾도록 hWndNext를 다시 대입.
if(pWnd->m_hWnd != hWndMain )
hWndNext= ::FindWindowEx(NULL, hWndNext, "#32770", "");
else
break;
}
// 조건에맞는 윈도우가 없음.
if(hWndNext == NULL )
returnFALSE;
// 찾았으므로자식 윈도우가 가지고 있는 콘트롤들의 핸들을 구한다.
CWnd* pCtrlEdit = NULL;
pCtrlEdit= CWnd::FromHandle(hWndNext)-> GetDlgItem( 0x0437 );
CWnd* pCtrlBtn = NULL;
pCtrlBtn= CWnd::FromHandle(hWndNext)-> GetDlgItem( 0x03FC );
intnLen = strSerialText.GetLength();
charstr[255] = {0,};
for(int i = 0 ; i < nLen ; i++ )
str[i]= strSerialText.GetAt(i);
if(pCtrlEdit != NULL)
{
//에디트 상자에 원하는 데이터를 전달한다.
::SendMessage(pCtrlEdit->m_hWnd,WM_SETTEXT, nLen, (WPARAM)str);
//버튼을 클릭하도록 한다.
::SendMessage(pCtrlBtn->m_hWnd,BM_CLICK, 0, 0);
}
returnTRUE;
}
환경 : CentOS 6.5
목표
- 일정주기마다지정된 폴더를 압축하여 백업 (Cron 데몬을 이용하여 백업)
- 압축된파일은 외부 저장공간에 복사하여 2중 백업을 실행(추후 FTP를 이용하여 백업)
1. 개요
스케줄 예약 및 실행을 위한 숙지 내용
crond(cron demon)
- 일정한주기를 가지고 특정 작업을 수행하는 데몬
crontab(cron table)
cron demon이 수행해야할 스케줄 정보가 입력된 테이블
/etc/rc.d/init.d/crond스크립트
crond데몬은/etc/rc.d/init.d/crond스크립트에 의해 시작, 종료, 재시작될 수 있습니다.
먼저 crond를 시작하기 위해서는“/etc/rc.d/init.d/crond start”라고 하시면 됩니다. 거의 대부분리눅스 시스템이 부팅이 되면서 ntsysv 설정항목에 의해 crond가시작되도록 설정되어 있으므로 crond는 부팅과 함께 자동 실행될 것입니다.
cron데몬의 시작, 종료, 재시작을 위한 스크립트.
cron데몬의 시작 : /etc/rc.d/init.d/crondstart
cron데몬의 종료 : /etc/rc.d/init.d/crondstop
cron데몬의 재시작 : /etc/rc.d/init.d/crondrestart
*Todo List
*. cron 데몬은 crontab에저장된 설정주기 및 내용을 수행
1) cron 데몬이 실행되도록 설정
2) crontab에 주기적으로 수행될 내용 및 주기를 설정
2. crond
*cron데몬 실행 여부 파악(ps활용)
[root@localhost ~]# ps -ef | grep crond
root 938 1 0 Mar12 ? 00:00:07 crond
root 3295 3261 0 01:55 pts/0 00:00:00 grep crond
3. crontab
명령어위치 : /usr/bin/crontab
사용형식
crontab [ -u 사용자ID ] 파일
crontab [ -u 사용자ID ] { -l | -r | -e }
crontab -l : 예약된 작업리스트 (list)
crontab -e : 예약된 작업 수정 (edit)
crontab -r : 예약된 작업 삭제 (remove)
예약된 작업리스트 보기
[root@redmine ~]# crontab -l
no crontab for root
(crontab이 설정되어 있지 않음.)
[root@redmine ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 -31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * *user-name command to be executed
crontab수정
[root@redmine ~]# crontab -e
0 0 1,15 * * /backup.sh
( 매월 1일과 15일 00시 00분에 /backup.sh 실행 )
backup.sh만들기
-backup.sh은 지정된 폴더를 현재시스템의 시간정보를 이용(date 명령)하여 압축화일명을 만들어 압축(zip 명령)하는 명령.
- svn 및 redmine을 주기적으로 백업
- redmine의 경우는 첨부파일을 별도로 백업
zip -r /root/backup/$(date '+%Y%m%d%H%M`)/testdir/
mysqldump -uroot -psm3936 redmine_db >/home/backup/redmine/db/redmine_db_$(date '+%Y%m%d').sql
zip -r /home/backup/redmine/db/$(date '+%Y%m%d')/opt/redmine/files/
mkdir /home/backup/svn/$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/HW >/home/backup/svn/$(date '+%Y%m%d')/HW_dump_$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/Documents >/home/backup/svn/$(date '+%Y%m%d')/Documents_dump_$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/FW > /home/backup/svn/$(date '+%Y%m%d')/FW_dump_$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/Projects >/home/backup/svn/$(date '+%Y%m%d')/Projects_dump_$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/RND >/home/backup/svn/$(date '+%Y%m%d')/RND_dump_$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/SW >/home/backup/svn/$(date '+%Y%m%d')/SW_dump_$(date '+%Y%m%d')
svnadmin dump /opt/repositories/svn/Reference >/home/backup/svn/$(date '+%Y%m%d')/Reference_dump_$(date '+%Y%m%d'
실행시 Permission denied 발생
chmod 711 /backup.sh
(권한 부여)
4. crontab 예제 (다른 웹자료)
# 매일 00시 05분에 특정작업을 하는 경우
5 0* * * $HOME/bin/daily.job >>$HOME/tmp/out 2>&1
# 매달 1일 오후 2시 15분에
15 14 1 * * $HOME/bin/monthly
# 월요일부터금요일 까지 매일 오후 10시에.
0 22 * * 1-5 mail -s "It's 10pm"joe%Joe,%%Where are your kids?%
# 일정시간에화면에 표시
23 0-23/2 * * * echo "이것은 매일 0, 2, 4, ... 시 23분에 보여집니다."
# 일정시간에 화면에 표시
5 4 * * 0 echo "이것은 매 일요일 오전 4시 5분에 보여집니다."
# 매시간 5분이 아닌매 5분마다 실행되게 설정하시려면
*/5 01 * * 1,2 /backup.sh 와 같이 입력합니다.
최근 덧글