有沒有人做過利用 SendMessage ( or PostMessage ) 間接控制 AP 的功能 |
缺席
|
linly
一般會員 發表:42 回覆:37 積分:15 註冊:2007-10-07 發送簡訊給我 |
我想應該有人這麼做過才對,我觸發我表單的事件後,利用 SendMessage ( or PostMessage ) 的方式送給外部應用程式( 例如 WORD ),例如可以做到點選 WORD 中的 "檔案->列印" 不過不打算利用 mouse_event ( 有些因素考量 ),那我應該要怎麼送這個訊息,以下是我根據 Spy++ 攔截的訊息,送出一模一樣的訊息給 WORD,讓他點檔案,不過沒反應:
[code cpp] int tempX = 681; int tempY = 39; int32 tempXY = (tempY<<16)|(tempX); // lParam LOWORD、HIWORD 所需要的訊息 SendMessage( 0x000304B2, WM_NCHITTEST, 0, tempXY ); // 0x000304B2 是否個我指定的外部應用程式,打算丟訊息給它處理 tempX = 10; // HTLEFT = 10 tempY = 0x0200; // WM_MOUSEMOVE = 0x0200 tempXY = (tempY<<16)|(tempX); // lParam LOWORD、HIWORD 所需要的訊息 SendMessage( 0x000304B2, WM_SETCURSOR, (UInt32)0x000304B2, tempXY ); tempX = 680; tempY = 40; tempXY = (tempY<<16)|(tempX); // lParam LOWORD、HIWORD 所需要的訊息 PostMessage( 0x000304B2, WM_NCMOUSEMOVE , (UInt32)10, tempXY ); tempX = 26; tempY = 12; tempXY = (tempY<<16)|(tempX); // lParam LOWORD、HIWORD 所需要的訊息 SendMessage( 0x000304B2, WM_PARENTNOTIFY, WM_LBUTTONDOWN , tempXY ); [/code] 希望強者們可以指導一下,已經不知道搞了幾天幾夜....XDDD |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
linly
一般會員 發表:42 回覆:37 積分:15 註冊:2007-10-07 發送簡訊給我 |
版主您好:
沒錯的,那是一個我事先開啟的 WORD,然後找到最上層父視窗的 HWND 為 0x000304B2,我是把訊息傳送給它。測試的時候我一邊用 Spy 攔截這個 WORD 父視窗的訊息,一邊就是點選我表單的按鈕,送出我上一篇提到的訊息:WM_NCHITEST、WM_SETCURSOR、WM_NCMOUSEMOVE、WM_PARENTNOTIFY...等。至於說如何得知要送這些訊息,也是當初親自用滑鼠點 WORD,用 Spy 攔截到的,希望有經驗的強者們能提供做法,一直獲得不到解決,去其他討論區詢問,也多半是官方說法 =____=。 這種情境的確出現在腦海中 - 在其他地方點一下,就會觸動其他程式的功能(當然不是用諸如 mouse_event 的方式),不過嘗試不出來,拜託了。 ===================引 用 Mickey 文 章=================== 你好: 姑且不論 SendMessage 參數是否正確. WORD 的 Window Handle 固定是 0x000304B2 ? |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
Window Handle...應該都是變動的...改用 EnumWindow 方式...
試了一下...一樣沒反應... 直覺...Window Message...應該是有問題 如果只是要觸動 Menu...可以考慮...直接送 WM_COMMAND...或送 Keyboard Event....可能比較容易些 type TWinFinder = record wClassName: string; Title: string; WHandle: HWnd; FoundWindow: Boolean; end; function WindowTesterByClassName(wnd: HWnd; var Info: TWinFinder): Bool; stdcall; var Buf: array [Byte] of Char; WText : string; begin GetClassName(wnd, Buf, sizeof(Buf)); WText := string(Buf); Result := True; if ( WText = Info.wClassName ) then begin Info.WHandle:= Wnd; Info.FoundWindow:=True; Result := False; end; end; procedure TForm3.Button1Click(Sender: TObject); var WFinder: TWinFinder; begin WFinder.wClassName := 'OpusApp'; // MS Word Window Class Name WFinder.FoundWindow := False; EnumWindows(@WindowTesterByClassName, Integer(@WFinder)); if not WFinder.FoundWindow then raise Exception.CreateFmt('Window : "%s" Not Found.',['MS WORD']); SendMessage(WFinder.WHandle, WM_NCHITTEST, 0, MakeLong(681,39)); SendMessage(WFinder.WHandle, WM_SETCURSOR, WFinder.WHandle, MakeLong(10,$200)); PostMessage(WFinder.WHandle, WM_NCMOUSEMOVE, 10, MakeLong(680,40)); SendMessage(WFinder.WHandle, WM_PARENTNOTIFY, WM_LBUTTONDOWN, MakeLong(26,12)); end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |