2009-04-27 3 views
0

SendMessage를 사용하여 다른 프로그램의 메뉴를 활성화하는 데 문제가 있습니다. 사용자가 메뉴를 클릭 할 때 ++ 스파이를 통해 볼 때 다음이 발생합니다SendMessage가 비 클라이언트 항목을 클릭합니다.

내가 WM_NCLBUTTONDOWN와 다음을 sendMessage 첨부를 사용하여 동일한하려고 할 때 반면
 
000A0628 P WM_NCLBUTTONDOWN nHittest:HTMENU xPos:1706 yPos:395 [wParam:00000005 lParam:018B06AA time:27:23:56.156 point:(1706, 395)] 
000A0628 S WM_SYSCOMMAND uCmdType:SC_MOUSEMENU xPos:1706 yPos:395 [wParam:0000F095 lParam:018B06AA] 
000A0628 S WM_ENTERMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000] 
000A0628 R WM_ENTERMENULOOP lResult:00000000 
000A0628 S WM_SETCURSOR hwnd:000A0628 nHittest:HTCAPTION wMouseMsg:0000 [wParam:000A0628 lParam:00000002] 
000A0628 R WM_SETCURSOR fHaltProcessing:False [lResult:00000000] 
000A0628 S WM_INITMENU hmenuInit:00200355 [wParam:00200355 lParam:00000000] 
000C0672 S EM_GETSEL lpdwStart:0010EFA0 lpdwEnd:0010EFA4 [wParam:0010EFA0 lParam:0010EFA4] 
000C0672 R EM_GETSEL wStart:26 wEnd:26 lpdwStart:0010EFA0 (684) lpdwEnd:0010EFA4 (276) [lResult:001A001A] 
000C0672 S WM_GETTEXTLENGTH wParam:00000000 lParam:00000000 
000C0672 R WM_GETTEXTLENGTH cch:26 [lResult:0000001A] 
000C0672 S EM_CANUNDO wParam:00000000 lParam:00000000 
000C0672 R EM_CANUNDO fCanUndo:True [lResult:00000001] 
000A0628 R WM_INITMENU lResult:00000000 
000A0628 S WM_MENUSELECT uItem:0 fuFlags:MF_POPUP | MF_HILITE | MF_MOUSESELECT hmenu:00200355 [wParam:80900000 lParam:00200355] 
000A0628 R WM_MENUSELECT lResult:00000000 
000A0628 S WM_INITMENUPOPUP hmenuPopup:00150595 uPos:0 fSystemMenu:False [wParam:00150595 lParam:00000000] 
000A0628 R WM_INITMENUPOPUP lResult:00000000

대신 발생합니다

 
000A0628 P WM_NCLBUTTONDOWN nHittest:HTMENU xPos:1700 yPos:400 [wParam:00000005 lParam:019006A4 time:27:25:02.156 point:(1700, 400)] 
000A0628 S WM_SYSCOMMAND uCmdType:SC_MOUSEMENU xPos:1700 yPos:400 [wParam:0000F095 lParam:019006A4] 
000A0628 S WM_ENTERMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000] 
000A0628 R WM_ENTERMENULOOP lResult:00000000 
000A0628 S WM_EXITMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000] 
000A0628 R WM_EXITMENULOOP lResult:00000000 
000A0628 S WM_MENUSELECT uItem:0 fuFlags:FFFF (menu was closed) hmenu:00000000 [wParam:FFFF0000 lParam:00000000] 
000A0628 R WM_MENUSELECT lResult:00000000 
000A0628 S WM_EXITMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000] 
000A0628 R WM_EXITMENULOOP lResult:00000000 
000A0628 R WM_SYSCOMMAND lResult:00000000 

사람이 얻는 방법을 알고 있나요 이게 제대로 작동하나요?

건배

로스

+0

, 나는 궁금하네요을 특히 sendMessage 첨부()를 사용할 수 있습니다 대체 솔루션이있을 수 있습니다. 달성하려는 내용 (즉, 다른 프로그램에서 메뉴를 활성화하려는 이유)을 알려주시겠습니까? – jdigital

+0

"원숭이"테스터를 만들려고합니다. 이것의 일부로 원숭이가 똑똑하기 만하면 종료/종료 버튼/메뉴 옵션으로 식별되는 것을 클릭하지 않아도됩니다. 대화 상자가 실제로 팝업되기 전에 클릭하기가 너무 빠르기 때문에 괜찮습니다 대화 상자는 여전히 입력을 수신하고 대화 상자에 마우스가있는 곳에서 종료 버튼이 있으면 대상 프로그램을 종료합니다. 이것은 원하는 효과가 아니므로 대화 상자가 나타날 때를 감지하는 몇 가지 방법이 필요합니다. SendMessage 블록 및이 기능을 제공합니다. – Ross

답변

1

메뉴 루프가 마우스 버튼의 상태를 테스트한다고 생각합니다. 그러나 마우스 버튼을 누르는 것을 시뮬레이션하지는 않았습니다. 버튼을 눌렀다는 메시지를 보내는 것뿐입니다.

동기 동작이 필요한 경우, windows hook을 제안하고 적절한시기까지 스레드를 차단하십시오. 즉, 비동기 방식을 사용하여 동기식 호출을 차단하고 동기식 호출의 역할을 수행 할 수 있습니다. 추가 작업이지만 본질적으로 비동기식 인 동기 동작을 고집한다면 최상의 솔루션입니다.

+0

동기가 필요한 주된 이유는 모든 팝업 메뉴/모달 대화 상자가 나타나고 감지 될 수있는 기회가 있기 때문입니다. 프로그램이 클릭하는 위치에 대한 사전 지식이 없기 때문에 Windows 후크로이 작업을 수행 할 수 있는지 확실하지 않습니다. 메뉴 루프를 속여서 버튼이 실제로 내려 졌다고 생각하고 SendMessage를 사용하여이를 수행하는 방법이 있습니까? – Ross

+0

버튼을 시뮬레이트하는 방법을 잘 모르겠지만 가능한 경우 버튼을 시뮬레이션 할 때를 어떻게 알 수 있습니까? – jdigital

1

당신은 마우스 클릭과 키 입력을 시뮬레이션 sendMessage 첨부를 사용하지 않아야합니다. 대신 SendInput을 사용하십시오.

+0

나는 SendInput을 사용할 수 있지만 메시지가 처리 될 때까지 SendInput이 블로킹되지 않는다는 것을 안다. 그리고 이것은 내가 프로그래밍하고있는 것에 활용해야하는 SendMessage의 속성 중 하나이다. – Ross

0

당신은 완벽하게 메뉴 (코드 샘플에 대한 MSDN과 구글 그룹을 참조하십시오)
(후크 여기 아무 상관이 없음)이 문제에 대해 생각에서

+0

원본 포스터는 이미 SendMessage를 시도했습니다. 응용 프로그램이 마우스 상태를보고 있지만 마우스 단추가 실제로 작동하지 않기 때문에 여기서는 작동하지 않습니다. SendMessage는 절반 만 수행합니다. – jdigital