用的hook的方式
SetWindowsHookEx(WH_CALLWNDPROC, MyHookProc, hModule, 0);
WM_IME_NOTIFY監聽這個訊息
static LONG IMENotifyHandle(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static int x = INVALID_VALUE;
static int y = INVALID_VALUE;
static int font_height = INVALID_VALUE;
FILE* fp;
fp = fopen("D:\\log.txt","a+");
SetLastError(0);
/*
這兩個效果好像一樣???
瀏覽器飛書 這里是空的 錯誤 1413
VS notepad++ 就可以獲取得到
*/
// 獲取當前正在輸入的視窗的輸入法句柄
HIMC hIMC = (HIMC)(LONG_PTR)GetWindowLongPtr(hWnd, IMMGWLP_IMC);
//HIMC hIMC = ImmGetContext(hWnd);
if (!hIMC)
{
sprintf(str, "!hIMC %d \n",GetLastError());
fwrite(str, strlen(str), 1, fp);
}
LPINPUTCONTEXT lpIMC;
// 通過句柄得到IMC結構 (input method context)
if (!(lpIMC = ImmLockIMC(hIMC)))
{
sprintf(str, "ImmLockIMC faild %d\n", GetLastError());
fwrite(str, strlen(str), 1, fp);
fclose(fp);
return 0L;
}
switch (wParam) {
case IMN_SETCOMPOSITIONWINDOW:
sprintf(str, "IMN_SETCOMPOSITIONWINDOW : ");
fwrite(str, strlen(str), 1, fp);
POINT pt;
pt = lpIMC->cfCompForm.ptCurrentPos;
ClientToScreen(lpIMC->hWnd, &pt);
sprintf(str, "x:%d y:%d \n",pt.x,pt.y);
fwrite(str, strlen(str), 1, fp);
//好像是可以用來計算字串的寬高
/*HDC hDC;
hDC = GetDC(lpIMC->hWnd);
GetTextExtentPoint(hDC, "A", 1, &szOffset);
ReleaseDC(lpIMC->hWnd, hDC);*/
//g_ptTopLeft.x = ptSrc.x + szOffset.cx;
//g_ptTopLeft.y = ptSrc.y + szOffset.cy;
break;
case IMN_SETCANDIDATEPOS:
sprintf(str, "IMN_SETCANDIDATEPOS :1111 \n");
fwrite(str, strlen(str), 1, fp);
break;
default:
break;
}
ImmUnlockIMC(hIMC);
fclose(fp);
return 0;
}
/**/注釋的哪里 急救助!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274560.html
標籤:C++ 語言
下一篇:C剛入門代碼
