통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
Visual C++ 포럼마을 입니다.
  마을등급 Visual C++   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 나성훈 주민 34036 since 2006-12-29
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
마을 게시판
등록된 마을 게시판이
없습니다.
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 질문&답변 ※ 꼭 답변채택을 해주시어 성의껏 답변해주신 회원님께 감사의 마음을 전하시길 바랍니다.
 windows service 프로그램을 사용한 마우스, 키보드 제어  | VC++ 일반 2020-02-27 오후 6:23:06
 love5742695  love5742695님께 메시지 보내기love5742695님을 내 주소록에 추가합니다.love5742695님의 개인게시판 가기 번호: 977676 추천:0  / 읽음:67

안녕하세요 오랜만에 접속하게 되네요.

 

간단한 매크로 프로그램을 만들어 보려고했는데요. 데스크탑 DC의 특정 값을 비교하여 마우스 또는 키보드의 특정 위치 클릭 또는 특정 버튼 입력을 구현 하고 있습니다.

 

아시다시피 잘만들어진 프로그램에선 일반적인 매크로는 다 막아놨더군요.

 

화면의 DC를 가져왔지만 마우스가 이동하여 눌릴위치에 클릭 이벤트가 안먹힌다던가.

 

키이벤트를 막아놨다던가.. 

 

결론은.. mouse_event는 사용이 안되고.

GetPixcel() 함수도 사용이 안되더군요..

해당 문제는 GetBits()를 사용해서 위치 계산후 RGB 값을 가져오는 방식으로 해결했습니다.. 만.

 

여전히 마우스 및 키보드의 메시지를 넘길수가 없었습니다.

 

Hooking 을 사용하면 해당 가드(보안프로그램) 가 실행을 중지 시키구요.

 

따라서 마지막 방법으로 Windows Service 단에서 이벤트를 발생 시켜보려고 합니다.

 

서비스 등록 프로그램을 만들고 Thread를 생성해서 반복적인 작업을 하게 하고 클릭이 되는것 까지 확인후(실제 클릭 하려는 참이 아닌 Test) 서비스에서 시작을 눌렀지만. GetPixcel() 함수가 검은색으로 나옵니다.

 

해당 DC 이미지로 저장해서 테스트 한 결과. 검정색 이미지가 저장됩니다.

 

VS 에서 디버깅 할때는 실제 DC도 저장이 잘되고 Pixcel 값도 잘 가져오는데. 서비스 에서 시작 하면 못가져오네요.

 

구글링 결과. 대화형 계정 이어야 한다는데. 도대체 대화형 계정을 설정 하는 방법, 대화형 계정은 무엇인가.

 

잘 안나오네요.

 

요점. mouse_event가 막혀있는 가드 프로그램이 있을 경우 Windows Service에서 제어 가능 한가.

 

제어 하기 위한 계정 설정 및 추가 서비스 생성시 유의 사항등.. 이 궁금 합니다.

이 글에 답변 등록하기
 [답변]서비스와 데스크톱 상호작용 허용 2020-02-27 오후 6:32:43
EnP 번호: 977677 추천:0  

 

 

서비스와 데스크톱 상호작용 허용

 

이 글에 답변 등록하기
         [답변]허용을 해도.. 2020-02-28 오전 8:57:59
 love5742695  love5742695님께 메시지 보내기love5742695님을 내 주소록에 추가합니다.love5742695님의 개인게시판 가기 번호: 977680 추천:0  

결과는 마찮가지 였습니다.

VS 통해서 디버깅 할때는 문제 없이 읽어오는데. 

관리도구 -> 서비스에서 시작 하면 못읽어 오더라구요..

이 글에 답변 등록하기
                 [답변]참고하세요. 2020-02-28 오후 5:32:11
은서네 번호: 977683 추천:0  

시스템 계정이 아닌 실제 사용할 계정을 지정해서 하시면 어떨지요?

이 글에 답변 등록하기
                         [답변]상황은 동일 합니다. 2020-03-03 오전 10:21:56
 love5742695  love5742695님께 메시지 보내기love5742695님을 내 주소록에 추가합니다.love5742695님의 개인게시판 가기 번호: 977701 추천:0  

COLORREF GetPixcelColor(HWND hWnd, int x, int y)

{

COLORREF color = { 0, };

HWINSTA hCurWndSta;

HWINSTA hWinsta;

HDESK hDesk;

hCurWndSta = GetProcessWindowStation();

if (hCurWndSta != NULL)

{

hWinsta = OpenWindowStation("winsta0", false,

WINSTA_ACCESSCLIPBOARD |

WINSTA_ACCESSGLOBALATOMS |

WINSTA_CREATEDESKTOP |

WINSTA_ENUMDESKTOPS |

WINSTA_ENUMERATE |

WINSTA_EXITWINDOWS |

WINSTA_READATTRIBUTES |

WINSTA_READSCREEN |

WINSTA_WRITEATTRIBUTES

);

if (hWinsta != NULL)

{

hDesk = OpenDesktop("default", DF_ALLOWOTHERACCOUNTHOOK, false,

DESKTOP_CREATEMENU |

DESKTOP_CREATEWINDOW |

DESKTOP_ENUMERATE |

DESKTOP_HOOKCONTROL |

DESKTOP_JOURNALPLAYBACK |

DESKTOP_JOURNALRECORD |

DESKTOP_READOBJECTS |

DESKTOP_SWITCHDESKTOP |

DESKTOP_WRITEOBJECTS

);

if (hDesk != NULL)

{

SetThreadDesktop(hDesk);

 

CWnd* pWnd = CWnd::FromHandle(GetDesktopWindow());

 

CDC* pDC = pWnd->GetDC();

CImage img;

CRect rt;

pWnd->GetWindowRect(&rt);

img.Create(rt.Width(), -rt.Height(), 24);

HDC hImgDC = img.GetDC();

BitBlt(hImgDC, 0, 0, rt.Width(), rt.Height(), pDC->GetSafeHdc(), 0, 0, SRCCOPY);

color = img.GetPixel(x, y);

int nR = GetRValue(color);

int nG = GetGValue(color);

int nB = GetBValue(color);

img.Save("D:\\Testttttt.jpg", Gdiplus::ImageFormatJPEG);

img.ReleaseDC();

pWnd->ReleaseDC(pDC);

img.Destroy();

}

}

}

픽셀을 얻어오는 세부 코드 입니다.

 

 

return color;

}

이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.