用CreateProcess創建行程后,通過EnumWindows查找子行程的句柄,一直找不到,又遇到過的嗎?在子行程通過CreateWiindows創建了視窗,用于接收父行程發送的訊息。但在父行程一直找不到接受訊息的句柄。在SendMessage的通過GetLastError回傳的錯誤值是6。有遇到過的嗎?該怎么解決啊?
發送方:
char chPath[]=TEXT("../Debug/Test.exe");
HWND hSendWindow = GetConsoleWindow ();
COPYDATASTRUCT CopyData;
CopyData.dwData = atoi(taskinfo->devid);
CopyData.cbData = sizeof(taskinfo);
CopyData.lpData = taskinfo;
if(CreateProcess(NULL,chPath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
//CloseHandle( pi.hProcess ); //hProcess跟hThread為pi的成員,分別為行程跟執行緒的句柄
//CloseHandle( pi.hThread );
ProcessWindow procwin;
procwin.dwProcessId = pi.dwProcessId;
procwin.hwndWindow = NULL;
HANDLE hcwnd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
// 等待新行程初始化完畢
WaitForInputIdle(pi.hProcess, 3000);
// 查找主視窗
Sleep(3000);
EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
int result = SendMessage(procwin.hwndWindow,WM_COPYDATA,(WPARAM)hSendWindow,(LPARAM)&CopyData)
int error = GetLastError();
}// 查找行程主視窗的回呼函式
BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)
{
ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;
DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
// 判斷是否是指定行程的主視窗
if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hwndWindow = hWnd;
return FALSE;
}
return TRUE;
}
接收方:
HWND CreateMessageWindow(WNDPROC lpfnWndProc)
{
TCHAR lpszClassName[256] = {0};
_stprintf_s(lpszClassName,_T("%d"),GetCurrentThreadId());
HINSTANCE hinstance = ::GetModuleHandle(NULL);
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = lpfnWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hinstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = lpszClassName;
wcex.hIconSm = NULL;
if (!RegisterClassEx(&wcex))
{
return FALSE;
}
//CreateWindow
return CreateWindowW(lpszClassName, _T("HBKJ"), WS_POPUP, 0, 0, 0, 0, HWND_MESSAGE, NULL, hinstance, NULL);
}
LRESULT CALLBACK MsgWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
COPYDATASTRUCT *pCopyDataStruct=(COPYDATASTRUCT*) lParam;
LPTSTR lpData = (LPTSTR)malloc( pCopyDataStruct->cbData+2);
switch (uMsg)
{
case WM_COPYDATA:
memcpy(lpData,pCopyDataStruct->lpData,pCopyDataStruct->cbData);
memset((LPBYTE)lpData+pCopyDataStruct->cbData,0,2);//末尾賦值空字符
_tprintf(_T("pCopyDataStruct->dwData = %d\npCopyDataStruct->lpData = %s\n"),pCopyDataStruct->dwData,lpData);
break;
default:
break;
}
free(lpData);
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
HWND hMsgWnd = CreateMessageWindow(MsgWndProc);
_tprintf(_T("Message Window Handle = %d\n"),hMsgWnd);
_tprintf(_T("Message Window(HANDLE=%d) Ready to receive Window Message...\n"),hMsgWnd);
/** 等待訊息 */
HWND HrecWindow = GetConsoleWindow ();
while(1)
{
MSG wd_msg;
if(PeekMessageW(&wd_msg, NULL, 0, 0,PM_REMOVE)){
if (wd_msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&wd_msg);
DispatchMessage(&wd_msg);
}
}
return 0;
}
uj5u.com熱心網友回復:
控制臺有發送訊息一說???
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/95797.html
上一篇:如何在代碼里強制關閉其它的程式?
