目前有一個應用是用rawinput處理滑鼠鍵盤的,我想模擬WM_INPUT發送滑鼠訊息,但是一點反應都沒有,請問是不是這個不支持跨行程發送,如果注入到目標行程呢?
uj5u.com熱心網友回復:
https://www.cnblogs.com/songr/p/5467007.htmluj5u.com熱心網友回復:
你的 代碼 ?uj5u.com熱心網友回復:
WM_INPUT 的 回應 如下:模擬一個 (HRAWINPUT)lParamcase WM_INPUT:https://msdn.microsoft.com/en-us/library/ms645590(VS.85).aspx
{
UINT dwSize;
GetRawInputData((HRAWINPUT)lParam, RID_INPUT,NULL,&dwSize,sizeof(RAWINPUTHEADER));
LPBYTE lpb = new BYTE[dwSize];
if (lpb == NULL)
{
return 0;
}
if (GetRawInputData((HRAWINPUT)lParam,RID_INPUT,lpb,&dwSize,sizeof(RAWINPUTHEADER)) !=
dwSize)
OutputDebugString (TEXT("GetRawInputData doesn't return correct size !\n"));
RAWINPUT* raw = (RAWINPUT*)lpb;
if (raw->header.dwType == RIM_TYPEKEYBOARD)
{
if ( raw->data.keyboard.Message == WM_KEYDOWN)
{
if (!IsInKeys(raw->data.keyboard.VKey))
{
char keytext[10] = {0};
BYTE state[256] = {0};
//通過虛擬鍵盤碼得到名字
ToAscii(raw->data.keyboard.VKey,raw->data.keyboard.MakeCode,state,(LPWORD)keytext ,0);
char buf[10] = {0};
string s = "鍵盤按下 虛鍵碼:"+ string(keytext);
MessageBoxA(NULL,s.c_str(),"鍵盤",MB_OK);
}
}
if( raw->data.keyboard.Message == WM_KEYUP)
{
erasekey(raw->data.keyboard.VKey);
}
}
delete[] lpb;
return 0;
}// end case WM_INPUT
uj5u.com熱心網友回復:
就是單純的SendMessageuj5u.com熱心網友回復:
這只是處理自己的WM_INPUT 我試過用這個構造的訊息 給目標應用SendMessage不好用啊uj5u.com熱心網友回復:
"我試過用這個構造的訊息 給目標應用SendMessage不好用啊"看看你的 代碼
uj5u.com熱心網友回復:
可能 “模擬一個 (HRAWINPUT)lParam“ 不在 同一 地址 空間uj5u.com熱心網友回復:
我的做法是 創意個對話框程式,然后自己注冊了WM_INPUT,然后收到了訊息后,直接SendMessage給另一個目標程式
uj5u.com熱心網友回復:
“直接SendMessage給另一個目標程式”必須 在 另一個目標程式 中· 模擬一個 (HRAWINPUT)lParam
uj5u.com熱心網友回復:
是這樣的老哥, 另一個程式是兄弟公司用u3d做的三維場景,我們要對他做自動化測驗, 通過注入掛鉤得知,他內部對滑鼠的處理是用raw input得到滑鼠訊息的,所以我們用SendMessage啥的是沒有效果, 老哥我沒太懂您的意思
uj5u.com熱心網友回復:
變數的 地址 不能 傳到 另一個目標程式,所以 要 在 另一個目標程式 中 申請 一塊 記憶體 即 (HRAWINPUT)lParam,把 內容 再 復制到另一個目標程式 , 再 SendMessage
uj5u.com熱心網友回復:
https://stackoverflow.com/questions/12590145/how-to-simulate-raw-input-send-a-wm-input-message-to-an-application-the-right 這個方法? 還是說我注入目標行程后,在他內部構造一個, 然后SendMessage
uj5u.com熱心網友回復:
參考
void CRemoteListCtrlDlg::RemoteHeaderItem(HWND hWnd)
{
// GetItemCount
int nHeaderCount=::SendMessage(hWnd,HDM_GETITEMCOUNT,0,0);
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(hWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
HDITEM *pHeaderItem = (HDITEM*)VirtualAllocEx(hProcess, NULL, sizeof(HDITEM), MEM_COMMIT, PAGE_READWRITE);
char *pItem = (char*)VirtualAllocEx(hProcess, NULL, 80, MEM_COMMIT, PAGE_READWRITE);
if ((!pHeaderItem) || (!pItem))
{
::MessageBox(NULL, "無法分配記憶體!", "錯誤!", NULL);
CloseHandle(hProcess);
return;
}
//
HDITEM HeaderItem;
HeaderItem.cchTextMax = 80;
HeaderItem.mask = HDI_TEXT;
HeaderItem.pszText = pItem;
//
char ItemBuf[80];
for(int i=0; i<nHeaderCount; i++)
{
HeaderItem.iOrder=i;
WriteProcessMemory(hProcess, pHeaderItem, &HeaderItem, sizeof(HDITEM), NULL);
::SendMessage(hWnd, HDM_GETITEM, i, (LPARAM)pHeaderItem);
ReadProcessMemory(hProcess, pItem, ItemBuf, 80, NULL);
// afxDump << ItemBuf << "\n";
}
//釋放記憶體
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pHeaderItem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
}
使用 VirtualAllocEx 遠程分配一個 (HRAWINPUT)lParam
uj5u.com熱心網友回復:
我看一般對WM_INPUT處理的時候,在訊息毀掉函式會直接釋放掉記憶體,這個沒影響把
uj5u.com熱心網友回復:
參考 VirtualFreeExuj5u.com熱心網友回復:
WM_INPUT內部是通過 GetRawInputData 函式來讀取的輸入事件,所以你光靠 SendMessage 是沒有任何卵用的。uj5u.com熱心網友回復:
同屬user32.dll下的 mouse_event、keybd_event、SendInput,這三個API函式可以對RawInput和DirectInput進行模擬輸入,但是是整個系統全域的,并不能對后臺對某個視窗單獨模擬。除非你注入dll到目標行程,HOOK掉 GetRawInputData 函式,這樣目標行程才可以后臺讀取到假的資料。uj5u.com熱心網友回復:
還是驅動一個機械手去按鍵盤和滑鼠的按鍵并移動滑鼠最靠譜。
uj5u.com熱心網友回復:
https://stackoverflow.com/questions/12590145/how-to-simulate-raw-input-send-a-wm-input-message-to-an-application-the-right轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62468.html
標籤:界面
上一篇:為何VC 列印圖片那么小
