|
첫째로
GetForegroundWindow 에 문제가 있습니다.
왜냐하면 저함수를 쓰면 화상키보드 프로그램의 핸들을 가져올것이니까요
화상 키보드 프로그램안에서 GetNextWindow함수로 입력창을 아무리 찾아봐야 소용없겠죠
둘째
SetAvtveWindow() 함수는 윈도우 가져오기 함수가 아닙니다.
이미 알고있는 윈도우의 HWND를 줘서 그 윈도우가 Avtive되도록 하는 함수입니다.
셋째
SetFocus API를 Builder에서 사용하는데 전혀 문제없습니다.
단 VCL에서 TWinControl에 SetFocus함수가 있으므로 Namespace를 구분해줘야 합니다.
VCL 함수 원형 ==> void TWinControl::SetFocus();
API ==> void * SetFocus(void *);
HWND TargetHwnd;
::SetFocus(TargetHwnd); // 이렇게 쓰시면 됩니다.
[추신]
윈도우 보조프로그램에 있는 화상키보드 프로그램을 여러번 실행해서 테스트 해보시면서
메카니즘을 분석해보십시요
1.화상키보드 프로그램이 Caption에 마우스 Down된 상태가 아닐때는
키보드 프로그램이 Active되어있지 않습니다.
Caption에서 Muouse Up하는 순간 이전에 Active되어있던 윈도우가 active되고 있죠
2.두번째로 키보드 프로그램을 띄워두고 다른곳에서 타이핑해보세요
다른곳에서 타이핑 하는데 화상 키보드 프로그램의 Key가 바뀌고 합니다.
Shift 나 CapsLock 등을 눌러보십시요
==> 즉 화상키보드 프로그램이 후킹을 이용한다는 것을 알수 있을것 같습니다.
반드시 후킹을 이용해야 하는가? 뭐 아닐수도 있겟습니다만 .... 그게 일반적인 방법같습니다.
온새미 님이 쓰신 글 :
: 안녕하세요, 온새미입니다... 항상 여기에서 도움만 받고 온 온새미군인데 또 구원의 손길을 받고자 질문을 올립니다...
:
: 제가 지금 질문할 내용은 크게 두가지로 말할 수 있는데,
:
: 'SetActiveWindow()를 이용한 윈도우 가져오기가 안되는데...[아래 소스에 내용이 :)]'
: 'keybd_event(VkKeyScan('ㅁ'), 0, 0, 0); 이런 형식이 되는지...'
:
: 이렇답니다... 자, 본격적으로 질문하도록 하겠습니다 :)
:
: 일단 첫번째 질문에 관한 것인데요, 제가 친구의 도움을 받아서 윈도우의 화상키보드다음의 순서 즉 Z순서상 화상키보드 다음 순서의 창[프로세스]을 잡아서 거기다가 keybd_event로 입력을 때려넣어서 실제 키보드에서 입력하듯이 하고 싶은데요... 아래에 소스를 좀 봐주세요...
:
: // Button q를 눌렀을때 발생하는 이벤트입니다. ////////////////////////////////////////////////
: void __fastcall TForm5::Button15Click(TObject *Sender)
: {
: HWND hwndFirst = ::GetForegroundWindow();
: HWND hwndNext;
: DWORD dwProcessID;
: char szTextWnd[128];
: do{
: GetWindowThreadProcessId(hwndFirst, &dwProcessID);
: //Process의 ID를 가지고 온다.
: if(IsWindowVisible(hwndFirst)){
: GetWindowText(hwndFirst, szTextWnd, 128);
: // 윈도우의 Text를 가지고 온다.
: if(GetCurrentProcessId() != dwProcessID){
: if(szTextWnd[0] != 0){
: SetActiveWindow(hwndFirst); // 이부분이 윈도우를 따오는 부분인듯...
: keybd_event(VkKeyScan('q'), 0, 0, 0);
: keybd_event(VkKeyScan('q'), 0, KEYEVENTF_KEYUP, 0);
:
: // MessageBox(NULL,szTextWnd,"dd",64);
: break;
: }
: }
: }
:
: hwndNext = hwndFirst;
: hwndFirst = GetNextWindow(hwndNext, GW_HWNDNEXT);
: // 다음 순위의 window를 가지고 온다.
: }while(hwndFirst);
: }
: //////////////////////////////////////////////////////////////////////////////////////////////
:
: SetActiveWindow가 핸들을 가져와서 해당 핸들은 Active상태로 만드는 것이 맞다면, 정상적으로 동작해야할텐데... 그게 안되네요...; 그래서 제 친구가 SetFocus라는 함수로 추천했습니다만, 빌더에서는 지원하지 않는 모양입니다...
: 제가 생각하는 궁극적인 목표는, Windows에서 기본으로 지원하는 화상키보드정도의 기능을 갖춘[뭐 기본적인 키입력기능입니다만...] 것을 만드는 것입니다. 제가 따로 만드는 이유가 윈도우의 화상키보드는 버튼크기가 너무 작기때문에, 제가 적용하려는 프로그램에는 좀 어려운 감도 있어서 말입니다...
:
:
: 자, 두번째 질문 들어갑니다... 위에서 거의 반은 말했지만요... :)
: keybd_event라는 함수를 화상키보드에서 쓰고있는데요, 키보드의 직접입력과 같은 기능이 있어서 쓰고 있었는데, 기존의 화상키보드에는 한/영키가 없어서 Virtual Key쪽을 뒤져보니, VK_HANGUL이라는 한글 IME 변환키가 있더군요 :) 그래서 가져다 쓰려는데... 문제는, 현재 IME상태가 한글인지, 영어인지 구별하여 만약 한글이면 화상키보드자판은 한글자판으로바꿔주고, 영어면 영어자판으로 바꿔주려고 합니다. 제가 워낙 비주얼한 쪽을 좋아해서리;ㅅ ;
: 좀 질문에서 벗어난 느낌이 드는데 이어서 계속하자면, keybd_event(VK_HANGUL, 0, 0, 0);을 쓰게되면 영어인 상태에서는 한글로 바뀌겠으나 한글상태에서 쓰게되면 어떻게 되는지 궁금합니다...
: 이번엔 진짜 메인질문인데요... 방금 질문했던것이 안되면, keybd_event(VkKeyScan('ㅁ'), 0, 0, 0); 이런형식으로 써야할텐데... 이것이 가능한가요? 궁금해서 몸이 비틀어질거같습니다...
:
: 시간이 갈 수록 마음이 조급해지네요 ㅠㅠ 빠르고 친절한 답변 기다리고 있겠습니다 :)
: 긴글 봐주셔서 감사합니다~
|