線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4406
推到 Plurk!
推到 Facebook!

有沒有人做過利用 SendMessage ( or PostMessage ) 間接控制 AP 的功能

缺席
linly
一般會員


發表:42
回覆:37
積分:15
註冊:2007-10-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-25 00:56:58 IP:61.216.xxx.xxx 訂閱
我想應該有人這麼做過才對,我觸發我表單的事件後,利用 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-25 10:56:09 IP:218.163.xxx.xxx 訂閱
你好:

姑且不論 SendMessage 參數是否正確.

WORD 的 Window Handle 固定是 0x000304B2 ?
linly
一般會員


發表:42
回覆:37
積分:15
註冊:2007-10-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-25 12:54:59 IP:140.113.xxx.xxx 訂閱
版主您好:
沒錯的,那是一個我事先開啟的 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-25 16:05:27 IP:218.163.xxx.xxx 訂閱
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;
系統時間:2024-11-24 13:58:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!