2013-03-27 2 views
0

활성 창/프로그램을 기반으로 다른 설정을로드해야하는 애플리케이션을 구축 중입니다 (예 : 크롬을 사용하는 경우 Chrome과 연결된 설정이로드 됨). MS Word로 설정하면 MS Word 설정이로드됩니다.콜백을 통해 클래스 속성 업데이트

지금 당장 나는 활성 창이 바뀔 때마다 데이터베이스에서 올바른 설정을 가져 오는 클래스 작업을하고 있습니다. 이 클래스에는 마지막으로 가져온 설정을 기반으로 값을 반환하는 "LookUp"메서드도 있습니다.

1)가 실행하는 확인 메시지를 가져올 수 없습니다 :이와 데 문제점

class RecipeBook{ 
    public: 
     RecipeBook(); 
     HWINEVENTEVENTHOOK hEvent; 
     string currentProgram; 
     static VOID CALLBACK WindowCallback(HWINEVENTHOOK hWinEventHook, 
              DWORD dwEvent, 
              HWND hwnd, LONG idObject, 
              LONG idChild, 
              DWORD dwEventThread, 
              DWORD dwmsEventTime); //Actual callback 
     void messageCheck(void*); 
} 

RecipeBook::RecipeBook(){ 
     this->hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, 
            EVENT_SYSTEM_FOREGROUND, 
            NULL,&WinEventProcCallback, 
            0, 0, 
            WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

     Start messageCheck(void*) in separate thread 
} 

void messageCheck(void*){ 
    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 

} 

VOID CALLBACK WindowCallback(HWINEVENTHOOK hWinEventHook, 
              DWORD dwEvent, 
              HWND hwnd, LONG idObject, 
              LONG idChild, 
              DWORD dwEventThread, 
              DWORD dwmsEventTime){ 

     Get the name of the active program from the HWND handle //This is working 
     Update RecipeBook->CurrentProgram 
} 

:

내가 의사 코드를 구현하기 위해 노력하고있어 설명하기 별도의 스레드. 코드를 순차적으로 실행하면 정상적으로 작동합니다. 내가 스레드에 messageCheck를 생성 할 때 다른 스레드가 생성처럼 그냥하지 않는 것

(

AfxBeginThread(&messageCheck, &currentProgram, THREAD_PRIORITY_NORMAL, 0, 0,NULL) 

사용).

2) 레서피 북의 값을 콜백에서 수정하는 방법을 모르겠습니다. 나는 콜백에서 그 이름을 되 돌리는 것을 생각해 봤지만 나는 그걸 작동시킬 수 없었다. 콜백 내에서 문자열을 편집 할 수 있다면 좋을 것입니다.

3) LookUp 메서드가 호출 될 때마다 현재 활성 프로그램을 요청할 것을 생각했지만 활성 프로세스 ID가 아니라 호출 프로세스 ID를 가져 오는 메서드 만 찾을 수있었습니다.

큰 질문이지만 조언을 많이 주시면 감사하겠습니다.

감사합니다.

+0

첫 번째 생각은 AfxBeginThread가 특정 서명과 일치하는 스레드 함수를 필요로한다는 것입니다. UINT __cdecl MyControllingFunction (LPVOID pParam); 매개 변수 오류가 있는지 확인하려면 AfxBeginThread 호출의 반환 값을 확인할 수 있어야합니다. – Derek

답변

0
GetForgroundWindow() 

그게 내가 찾고있는 것입니다! 내가 GetActiveWindow()를 사용하려고 시도했다 몇 가지 이유를 들어

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633505(v=vs.85).aspx

와 나는 배경 창을 생각하고 어떤 이유를 forground 창을보고 할 때마다. 너!

누군가가 멀티 태스킹, 콜백 (CALLBACK) 작업을 수행하는 방법을 잘 설명 할 수 없다면이 기능을 사용하고 Lookup이 완료 될 때마다 현재 창을 쿼리 할 것입니다. 그렇게 자주해서는 안되며이 과정은 오래 걸리지 않을 것입니다. 활성 창에서 프로세스의 이름을 얻는 방법에 관심있는 사람들을위한

은/창 핸들을 사용하여 PID, 이것은 내가 해왔 방법입니다

DWORD processID; 
LPTSTR processName = new TCHAR[MAX_PATH]; 
DWORD nameSize = MAX_PATH; 
HWND activeWindowH = GetForegroundWindow(); 
DWORD threadID = GetWindowThreadProcessId(activeWindowH,&processID); 
HANDLE processHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_QUERY_INFORMATION,FALSE,processID); 
BOOL nameSuccess = QueryFullProcessImageName(processHandle,0,processName,&nameSize); 

건배!

관련 문제