2011-06-25 125 views
2

我試圖通過SendMessage(..)方法將鼠標事件發送到窗口中的窗口。爲什麼我的假按鈕按下SendMessage失敗?

我面臨的問題是,郵件似乎不會傳送到我要發送給他們的窗口,即使SendMessage返回0,(根據文檔)表示郵件已成功傳送。

我用下面的代碼:

(讓pPoint結構和selectedWindow.Handle有效的句柄到窗口)

int position = ((p.X & 0xFFFF) << 16) | (p.Y & 0xFFFF); 

SendMessage(selectedWindow.Handle, 0x0201, new IntPtr(), new IntPtr(position)); 
SendMessage(selectedWindow.Handle, 0x0202, new IntPtr(), new IntPtr(position)); 

0x02010x0202WM_LBUTTONDOWNWM_LBUTTONUP

有人能告訴我爲什麼這不起作用嗎?

(編輯:我使用ScreenToClient()方法將屏幕位置轉換到窗口內的位置是):

首先,請確保座標是相對於

+0

我認爲你是對的。一個已經成爲Windows API一部分的函數可能不會起作用,並且你是第一個注意到的。 ;)(換句話說,如果你問了如何使用這個函數,而不是問它是否可以工作,那麼你的問題標題可能會更準確*) – jalf

+0

@jalf:我沒有用問號結束問題沒有:p! – Kevin

回答

4

鼠標消息通常從消息隊列中檢索,這意味着您應該使用PostMessage()。但是這並不是真正的問題,只有很少的程序在消息循環中處理鼠標。 UAC是一種明顯的故障情況,您不能將消息發送到高級程序擁有的窗口。您發送錯誤的WParam值,可能會產生影響。當然,你可能有錯誤的窗口句柄。

但更可能的原因是我們看不到的代碼。你似乎要經歷一些麻煩來生成消息的X座標和Y座標。沒有這樣的努力是必要的,沒關係其中你點擊按鈕。您可以在(1,1)處單擊它:

PostMessage(selectedWindow.Handle, 0x0201, new IntPtr(1), new IntPtr(0x10001)); 
PostMessage(selectedWindow.Handle, 0x0202, new IntPtr(0), new IntPtr(0x10001)); 

或者換句話說,鼠標座標與窗口左上角相對。額外的黑客正在生成BM_CLICK消息以及該按鈕生成的WM_COMMAND消息。

使用Spy ++工具來觀察消息處理。

3

我有三點建議窗口客戶區的起源。如果您使用的是屏幕座標,則必須先使用ScreenToClient函數對其進行轉換。

其次,嘗試使用PostMessage而不是SendMessage。這更接近地模擬了Windows的實際行爲。

最後,除非您完全反對移動實際的鼠標指針,否則您可能會發現使用mouse_event或SendInput函數更容易。

+0

我會嘗試使用PostMessage tommorow。感謝您的答覆。 – Kevin

+0

這也沒有工作。它認爲它與Windows的安全性有關,所以只有創建該窗口的線程才能發送事件? – Kevin