我在做一个输入法自动翻译的程序
我用   
PeekMessage(Msg,PMsg(lParam)^.hwnd,WM_CHAR,WM_CHAR,PM_NOYIELD or PM_REMOVE);取消输入法的输入的文字,为什么对QQ聊天窗口无效呢?在其他编辑窗口 如记事本等 都没有问题.

解决方案 »

  1.   

    也许是我方向错了吧?我就想实现输入法自动翻译  这样的效果 比如在输入法输入"GOOD"    然后在窗口出现"好的"
      

  2.   


    但是我发送字符的话可以啊,
    目前的QQ窗口的情况是:"GOOD好的"现在要怎么把这GOOD去掉
      

  3.   

    把WM_KEYDOWN、WM_KEYUP一道取一下试试?
      

  4.   

    顺便请教楼主是怎样用PeekMessage取记事本程序消息序列里的消息的
      

  5.   


    我没有取消息啊 ,都是删除消息 PM_REMOVE,也没有指定记事本,都是在输入法那边执行的
    PeekMessage(Msg,PMsg(lParam)^.hwnd,WM_CHAR,WM_CHAR,PM_NOYIELD or PM_REMOVE); 
      

  6.   

    网上很多输入法外挂都可以实现这样的效果,比如火星文外挂输入法,繁体外挂输入法不知道他们是怎么实现的看了下他们的DLL.没看到什么特别的API
    名称位于 hxw
    地址       区段       类型    (  名称                                              注释
    100111B8   .rdata     输入         OLEAUT32.#4
    100111BC   .rdata     输入         OLEAUT32.#6
    100111E8   .rdata     输入    (    USER32.CallNextHookEx
    100111F8   .rdata     输入    (    USER32.CallWindowProcA
    100111D8   .rdata     输入    (    USER32.CallWindowProcW
    10011048   .rdata     输入    (    KERNEL32.CloseHandle
    10011230   .rdata     输入         ole32.CoInitialize
    100110A4   .rdata     输入    (    KERNEL32.CompareStringA
    100110A0   .rdata     输入    (    KERNEL32.CompareStringW
    10011234   .rdata     输入         ole32.CoUninitialize
    10011058   .rdata     输入    (    KERNEL32.CreateFileA
    10011020   .rdata     输入    (    KERNEL32.CreateToolhelp32Snapshot
    100111A4   .rdata     输入    (    KERNEL32.DeleteCriticalSection
    10001CF0   .text      输出         EnableConversion
    10011134   .rdata     输入    (    KERNEL32.EnterCriticalSection
    100110AC   .rdata     输入         KERNEL32.EnumSystemLocalesA
    10011178   .rdata     输入    (    KERNEL32.ExitProcess
    1001112C   .rdata     输入    (    KERNEL32.FatalAppExitA
    100111E4   .rdata     输入    (    USER32.FindWindowA
    100110BC   .rdata     输入    (    KERNEL32.FlushFileBuffers
    10011034   .rdata     输入    (    KERNEL32.FlushInstructionCache
    10011060   .rdata     输入    (    KERNEL32.FormatMessageA
    10011108   .rdata     输入    (    KERNEL32.FreeEnvironmentStringsA
    10011104   .rdata     输入    (    KERNEL32.FreeEnvironmentStringsW
    100110E0   .rdata     输入    (    KERNEL32.GetACP
    100111FC   .rdata     输入    (    USER32.GetClassNameA
    10011158   .rdata     输入    (    KERNEL32.GetCommandLineA
    100110E4   .rdata     输入    (    KERNEL32.GetCPInfo
    10011028   .rdata     输入    (    KERNEL32.GetCurrentProcess
    10011174   .rdata     输入    (    KERNEL32.GetCurrentThread
    10011068   .rdata     输入    (    KERNEL32.GetCurrentThreadId
    10011100   .rdata     输入    (    KERNEL32.GetEnvironmentStrings
    100110FC   .rdata     输入    (    KERNEL32.GetEnvironmentStringsW
    10011184   .rdata     输入    (    KERNEL32.GetEnvironmentVariableA
    10011098   .rdata     输入    (    KERNEL32.GetFileSize
    10011110   .rdata     输入    (    KERNEL32.GetFileType
      

  7.   

    100111EC   .rdata     输入    (    USER32.GetFocus
    10011038   .rdata     输入    (    KERNEL32.GetLastError
    100110B0   .rdata     输入    (    KERNEL32.GetLocaleInfoA
    100111A8   .rdata     输入    (    KERNEL32.GetLocaleInfoW
    10011148   .rdata     输入    (    KERNEL32.GetLocalTime
    1001103C   .rdata     输入    (    KERNEL32.GetModuleFileNameA
    1001111C   .rdata     输入    (    KERNEL32.GetModuleHandleA
    100110DC   .rdata     输入    (    KERNEL32.GetOEMCP
    10011088   .rdata     输入    (    KERNEL32.GetPrivateProfileIntA
    10011074   .rdata     输入    (    KERNEL32.GetPrivateProfileSectionA
    1001107C   .rdata     输入    (    KERNEL32.GetPrivateProfileStringA
    10011014   .rdata     输入    (    KERNEL32.GetProcAddress
    1001110C   .rdata     输入    (    KERNEL32.GetStartupInfoA
    10011114   .rdata     输入    (    KERNEL32.GetStdHandle
    100110C4   .rdata     输入    (    KERNEL32.GetStringTypeA
    100110C0   .rdata     输入    (    KERNEL32.GetStringTypeW
    10011144   .rdata     输入    (    KERNEL32.GetSystemTime
    10011140   .rdata     输入    (    KERNEL32.GetTimeZoneInformation
    100110A8   .rdata     输入    (    KERNEL32.GetUserDefaultLCID
    1001115C   .rdata     输入         KERNEL32.GetVersion
    10011188   .rdata     输入    (    KERNEL32.GetVersionExA
    10011210   .rdata     输入    (    USER32.GetWindowLongA
    10011208   .rdata     输入    (    USER32.GetWindowLongW
    10011150   .rdata     输入    (    KERNEL32.HeapAlloc
    10011190   .rdata     输入    (    KERNEL32.HeapCreate
    1001118C   .rdata     输入    (    KERNEL32.HeapDestroy
    1001113C   .rdata     输入    (    KERNEL32.HeapFree
    1001114C   .rdata     输入    (    KERNEL32.HeapReAlloc
    10011180   .rdata     输入    (    KERNEL32.HeapSize
    10011224   .rdata     输入         imagehlp.ImageDirectoryEntryToData
    10011000   .rdata     输入         IMM32.ImmGetCompositionStringA
    10011004   .rdata     输入         IMM32.ImmGetCompositionStringW
    100111A0   .rdata     输入    (    KERNEL32.InitializeCriticalSection
    100110EC   .rdata     输入    (    KERNEL32.InterlockedDecrement
    100110E8   .rdata     输入    (    KERNEL32.InterlockedIncrement
    100110F4   .rdata     输入    (    KERNEL32.IsBadCodePtr
    100110F8   .rdata     输入    (    KERNEL32.IsBadReadPtr
    1001119C   .rdata     输入    (    KERNEL32.IsBadWritePtr
    100111F4   .rdata     输入    (    USER32.IsCharAlphaNumericA
    100110B4   .rdata     输入    (    KERNEL32.IsValidCodePage
    100110B8   .rdata     输入    (    KERNEL32.IsValidLocale
    10011200   .rdata     输入    (    USER32.IsWindow
    10011204   .rdata     输入    (    USER32.IsWindowUnicode
    100110CC   .rdata     输入    (    KERNEL32.LCMapStringA
    100110C8   .rdata     输入    (    KERNEL32.LCMapStringW
    10011130   .rdata     输入    (    KERNEL32.LeaveCriticalSection
    10011120   .rdata     输入    (    KERNEL32.LoadLibraryA
    1001100C   .rdata     输入    (    KERNEL32.LoadLibraryExA
    10011010   .rdata     输入    (    KERNEL32.LoadLibraryExW
    10011094   .rdata     输入    (    KERNEL32.LoadLibraryW
    1001105C   .rdata     输入    (    KERNEL32.LocalFree
    1001106C   .rdata     输入    (    KERNEL32.lstrcatA
    10011090   .rdata     输入    (    KERNEL32.lstrcmpA
    1001102C   .rdata     输入    (    KERNEL32.lstrcmpiA
    10011070   .rdata     输入    (    KERNEL32.lstrcpyA
    10011064   .rdata     输入    (    KERNEL32.lstrcpynA
    10011050   .rdata     输入    (    KERNEL32.lstrlenA
    10011218   .rdata     输入    (    USER32.MessageBoxA
    1001101C   .rdata     输入    (    KERNEL32.Module32First
    10011018   .rdata     输入    (    KERNEL32.Module32Next
    10011078   .rdata     输入    (    KERNEL32.MultiByteToWideChar
    100111B0   .rdata     输入         OLEACC.ObjectFromLresult
    10011044   .rdata     输入    (    KERNEL32.OutputDebugStringA
    100111D0   .rdata     输入    (    SHLWAPI.PathFileExistsA
    100111C8   .rdata     输入    (    SHLWAPI.PathFindFileNameA
    100111C4   .rdata     输入    (    SHLWAPI.PathRemoveFileSpecA
    10011154   .rdata     输入    (    KERNEL32.RaiseException
    10011124   .rdata     输入    (    KERNEL32.ReadFile
    100111E0   .rdata     输入    (    USER32.RegisterWindowMessageA
    10011138   .rdata     输入    (    KERNEL32.RtlUnwind
    100111DC   .rdata     输入    (    USER32.SendMessageTimeoutA
    100110D8   .rdata     输入    (    KERNEL32.SetConsoleCtrlHandler
    1001109C   .rdata     输入    (    KERNEL32.SetEnvironmentVariableA
    10011054   .rdata     输入    (    KERNEL32.SetFilePointer
    10011118   .rdata     输入    (    KERNEL32.SetHandleCount
    1001116C   .rdata     输入    (    KERNEL32.SetLastError
    100110D4   .rdata     输入    (    KERNEL32.SetStdHandle
    10011128   .rdata     输入    (    KERNEL32.SetUnhandledExceptionFilter
    10011214   .rdata     输入    (    USER32.SetWindowLongA
    1001120C   .rdata     输入    (    USER32.SetWindowLongW
    1001121C   .rdata     输入    (    USER32.SetWindowsHookExA
    100111CC   .rdata     输入    (    SHLWAPI.SHGetValueA
    100110D0   .rdata     输入    (    KERNEL32.Sleep
    1001122C   .rdata     输入         ole32.StgCreateDocfile
    10011238   .rdata     输入         ole32.StgOpenStorage
    1001117C   .rdata     输入    (    KERNEL32.TerminateProcess
    10011164   .rdata     输入    (    KERNEL32.TlsAlloc
    10011168   .rdata     输入    (    KERNEL32.TlsFree
    10011170   .rdata     输入    (    KERNEL32.TlsGetValue
    10011160   .rdata     输入    (    KERNEL32.TlsSetValue
    100110F0   .rdata     输入    (    KERNEL32.UnhandledExceptionFilter
    100111F0   .rdata     输入    (    USER32.UnhookWindowsHookEx
    10011198   .rdata     输入    (    KERNEL32.VirtualAlloc
    10011194   .rdata     输入    (    KERNEL32.VirtualFree
    10011040   .rdata     输入    (    KERNEL32.VirtualProtect
    10011030   .rdata     输入    (    KERNEL32.VirtualQuery
    10011080   .rdata     输入    (    KERNEL32.WideCharToMultiByte
    1001104C   .rdata     输入    (    KERNEL32.WriteFile
    1001108C   .rdata     输入    (    KERNEL32.WritePrivateProfileSectionA
    10011084   .rdata     输入    (    KERNEL32.WritePrivateProfileStringA
    10011024   .rdata     输入    (    KERNEL32.WriteProcessMemory
    10005E17   .text      输出         <模块入口点>                                           (初始 cpu 选择)
      

  8.   

    搞了半天,原来楼主是取消输入法,那么你直接模拟一下ESC键就可以了。代码: keybd_event(VK_ESCAPE,0,0,0);
     keybd_event(VK_ESCAPE,0,KEYEVENTF_KEYUP,0);
      

  9.   

    SendMessage(PMsg(lParam)^.hwnd,KEYEVENTF_KEYUP,VK_ESCAPE,0);QQ聊天窗口就变不能输入了,
      

  10.   


    SendMessage(HIMC,KEYEVENTF_KEYUP,VK_ESCAPE,0); 的话,没有效果 
      

  11.   

    不用SendMessage(HIMC,KEYEVENTF_KEYUP,VK_ESCAPE,0); 用
    keybd_event(VK_ESCAPE,0,0,0); 
    keybd_event(VK_ESCAPE,0,KEYEVENTF_KEYUP,0);
    不可以吗?
      

  12.   

    这样的话转换的结果也发送不过去了,窗口那样的文字都没了
    我就想实现的是输入法自动翻译  这样的效果 比如在输入法输入"GOOD"    然后根据GOOD转换成"好的"  .然后在窗口只显示"好的" 
      

  13.   

    不知道有没有方法可以修改 输入法的  消息缓冲区 lpdwTransKeyGoogle 下  有ImmGenerateMessage , ImeToAsciiEx  两个方法 不知道怎么用
      

  14.   

    现在发现不是QQ窗口的问题 ,是所有RichEdit 都会这样啊
      

  15.   

    无论是QQ窗口还是其它RichEdit,都可以实现的。
      

  16.   

    代码:
    procedure TForm1.RichEdit1Change(Sender: TObject);
    var i:integer;
    begin
     i:=pos('GOOD',RichEdit1.Lines.Text);
     if i=0 then exit;
     RichEdit1.SelStart:=i-1;
     RichEdit1.SelLength:=length('GOOD');
     SendMessage(RichEdit1.Handle,EM_REPLACESEL,0,INTEGER(PCHAR('好的')));
    end;