简单来说,就是我模拟键盘消息,当按下字母Q的时候。,我发送从配置文件读取的字符串,但是出问题了,只能在edit上有效果,在TXT等上面无效果,但是直接发送常量却可以,求高人指点
void SetInfoMsg(LPCTSTR cInfo, HWND hWnd)
{
const char* cTemp = cInfo;
while(*cTemp != '\0')
{
SendMessage(hWnd, WM_CHAR, 'a', NULL);//这个a可以被模拟出来
SendMessage(hWnd, WM_CHAR, *cTemp++, NULL);//这样的却不行
}
}void TriggerMsg(CString& strMSg)
{
HWND hWnd;
hWnd   =   GetForegroundWindow();
DWORD   FormThreadID   =   GetCurrentThreadId();   
DWORD   CWndThreadID   =   GetWindowThreadProcessId(hWnd,   NULL); 
AttachThreadInput(CWndThreadID,   FormThreadID,   true);  hWnd   =   GetFocus();   //   得到当前键盘光标所在的窗口   
AttachThreadInput(CWndThreadID,   FormThreadID,   false);   //   取消    SetInfoMsg(strMSg, hWnd);}

解决方案 »

  1.   

    这样转进去会出问题,如果穿进去一个 const char * 也没问题
      

  2.   

    你试试先用 char cTmp = *cTemp++; SendMessage(hWnd, WM_CHAR, cTmp,NULL); 替换试试
      

  3.   


    void SetInfoMsg(LPCTSTR cInfo, HWND hWnd)
    {
        const char* cTemp = cInfo;
        while(*cTemp != '\0')
        {
            SendMessage(hWnd, WM_CHAR, 'a', NULL);//这个a可以被模拟出来
            SendMessage(hWnd, WM_CHAR, *cTemp++, NULL);//这样的却不行
        }
    }void CDlgDemoDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    CWnd* pWnd = GetDlgItem(IDC_EDIT_CODE);
    SetInfoMsg("123",pWnd->m_hWnd);
    }
    楼主,我这样去试你的代码,框里可以成功地出现 a1a2a3 的,也就是你的代码应该是对的.
      

  4.   

    SORRY,没看清楚你的题,在EDIT上有效,在TXT上无效,TXT指的是什么?
      

  5.   

    SetInfoMsg(strMSg, hWnd);
    ======
    你这里传进去的是CString吧,而你在SetInfoMsg中定义的参数是LPCTSTR,将strMsg改成一个char数组试试。
      

  6.   

    CString 有重载了 LPCTSTR 的操作符,要求 LPCTSTR 的参数,传CString 是可以的.
    对于参数类型来说 TCHAR[] 与 LPCTSTR 是一样的.
    相当于在ASCII 环境中的 char[] char* 是一样的
      

  7.   

    我用EDIT试了你的代码,是可以的,不知道你所说的TXT到底指的是什么
      

  8.   

    如果我在SetInfoMsg(strMSg, hWnd);语句前面,显示的定义 strMSg = "1sfe";可以输出lsfe,偏偏这种读配置文件的不让,我用MessageBox看过读配置文件后的值,是正确的
      

  9.   

    测试发现,如果我在其他的进程,也就是不是调用dll的对话框的进程,值弹出的竟然是空值,但是我的配置文件是通过dll读取的啊 很奇怪。,。。
      

  10.   

    我定义了一个全局钩子HOOK,用于捕捉键盘消息, 我在这个dll里面读取的配置文件的信息,然后通过另外一个程序HookTest来调用它,我的设定是当输入字母键Q,我把配置文件的信息的一个字符串模拟出来,就好像自己输入一样----------------------------------------------
    我现在去尝试让 HookTest去读配置文件,从而去传给dll,但是我很疑惑的是 为什么当前进程是HookTest,才显示读取的正确的配置文件的信息,如果不是,则无法显示
      

  11.   

    我现在去尝试让 HookTest去读配置文件,从而去传给dll,但是我很疑惑的是 为什么当前进程是HookTest,才显示读取的正确的配置文件的信息,如果不是,则无法显示
    =========
    很简单,全局钩子被注入到别的进程中之后,这个DLL就是别的进程中的一部分,它使用被注入的进程的内存空间,你的HookTest读出来的信息根本传入的DLL是HookTest加载的DLL,而不是被注入到别的进程中去的DLL。DLL并不共享数据区。
      

  12.   

    之前我也试过类似楼主的代码,就是跨进程传指针参数.是不行的,因为该指针值是本进程的虚地址.
    那个地址,在对方进程不知道是什么数据.但也是有办法可以实现跨进程传指针,我之前也试过代码是可以的.1 VirtualAllocEx 在对方进程先分配空间
    2 WriteProcessMemory 把要处理的字符串写入对方进程的地址空间
    3 发消息传参时,写上刚才在对方进程分配并写入的地址
    4 处理完后,VirtualFreeEx 刚才分配的空间
      

  13.   

    之前我也试过类似楼主的代码,就是跨进程传指针参数.是不行的,因为该指针值是本进程的虚地址.
    那个地址,在对方进程不知道是什么数据.但也是有办法可以实现跨进程传指针,我之前也试过代码是可以的.1 VirtualAllocEx 在对方进程先分配空间
    2 WriteProcessMemory 把要处理的字符串写入对方进程的地址空间
    3 发消息传参时,写上刚才在对方进程分配并写入的地址
    4 处理完后,VirtualFreeEx 刚才分配的空间
      

  14.   

    是不是UNICODE串?如果是,需要转换成ANSI
      

  15.   

    我暂时是写死了数据,汗。VC里面这样可以共享#pragma data_seg("MyHookCtl")
    HWND g_hWnd = NULL;
    #pragma data_seg()
    g_hWnd 是调用的那个程序的句柄,可惜如果我在里面+字符串什么的,来接收程序发送过来的数据,可惜没用明天结贴
    另外如果有高人在的话,问下 模拟键盘输入,我手写可以,为什么比如一些网站自己写的输入控件,应该是封装了,请教下,这样的该怎么弄,貌似我模拟它不承认
    keybd_event(VK_DECIMAL, 0, 0, 0); 
    keybd_event(VK_DECIMAL, 0, KEYEVENTF_KEYUP, 0);
      

  16.   

    g_hWnd 是调用的那个程序的句柄,可惜如果我在里面+字符串什么的,来接收程序发送过来的数据,可惜没用==============
    DLL共享变量是可以的,最好定义成char数组,而且必须要初始化。