我写了一个向非当前焦点的记事本程序发送按数字键5的消息的小程序但是实现不了按键功能,专家哥哥救命啊困绕我几天了!!
这是代码
procedure TForm1.Button1Click(Sender: TObject);
var
h:HWND;
begin
h:=findwindow(nil,'a.txt - 记事本');
if h<>0 then
begin
sendMessage(h,WM_KEYDOWN,53,0);
sendMessage(h,WM_KEYUP,53,0);
end
else
showmessage('no run')
end;
end.

解决方案 »

  1.   

    你应该找到那个输入框的句柄来发送消息,而不是窗口。EnumChildWindows
      

  2.   

    procedure TForm1.Button11Click(Sender: TObject);
    var
      wnd : HWND;
      buffer : array [0..256] of Char;
    begin
      wnd := FindWindow('Notepad', nil);
      if IsWindow(wnd) then
      begin
        wnd := FindWindowEx(wnd, 0, 'Edit', nil);
        if IsWindow(wnd) then
        begin
          FillChar(buffer, sizeof(buffer), #0);
          SendMessage(wnd, WM_GETTEXT, sizeof(buffer) - 1, Integer(@buffer));      StrLCopy(buffer, 'this is a test!', sizeof(buffer) - 1);
          SendMessage(wnd, WM_SETTEXT, 0, Integer(@buffer));
        end;
      end;
    end;
      

  3.   

    但是我发送sendMessage(h,WM_DESTROY,0,0); 消息时都能成功关闭记事本程序,为什么发送按键消息时就不行
      

  4.   

    你只能从句柄上面下手
    function   MyEnumWindowsProc(hwnd   :   Hwnd;         //   handle   to   parent   window   
                                                        lParam   :   LPARAM)   :   Boolean;   stdcall;   //   application-defined   value   
      var   
          clsName   :   Array   [0..127]   of   char;   
      begin   
          FillChar(clsName,sizeof(clsname),0);   
          if   GetClassName(hwnd,   clsName,sizeof(clsname))   >   0   then   
          begin   
              if   clsName   =   'Edit'   then   
              begin   
                  SendMessage(hwnd,   wm_paste,0,0);     //   paste   data.   
                  SendMessage(hwnd,   wm_char,102,0);     //   put   a   char   to   notepad.   
              end;   
          end;   
      end;   
        
      procedure   TForm1.Button1Click(Sender:   TObject);   
      var   
          hNotepad   :   Thandle;   
      begin   
          WinExec('Notepad.exe',sw_shownormal);   
          hNotepad   :=   FindWindow('Notepad',nil);   
          if   hNotepad   >   0   then   
          begin   
              richedit1.SelectAll   ;   
              SendMessage(richedit1.handle,wm_copy,0,0);   
              EnumChildWindows(hNotepad,@MyEnumWindowsProc,0);   
      //         SendMessage(hNotepad,   WM_SysCommand,   SC_MINIMIZE,0);   
          end;   
      end;
    一个例子,不知有没有用
      

  5.   

    你想要看到的是什么效果呢?又能看到什么效果呢?NotePad.exe不是Delphi写的,它的消息处理不同于Delphi,并不是说你发到窗口,窗口就会把消息转交给Edit。至于你的WM_Destroy,窗口支持该消息的处理当然有效。
      

  6.   

    或者你用SETWINDOWTEXT函数来处理
      

  7.   

    另外,发送的时候,最好是WM_CHAR
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
    h1:HWND;
    begin
    h1:=findwindow(nil,'手机顽童模拟器');
    if h1<>0 then
    begin
    SendMessage(h1,WM_KEYDOWN,13,0);
    SendMessage(h1,WM_KEYUP,13,0);
    end
    else
    showmessage('no run')
    end;
    end.
    模拟按回车无效