如何建立一个窗口,类似虚拟键盘一样,即使点击它,也不会取得系统的焦点?

解决方案 »

  1.   

    没看明白意思....-_-!
    是不是指 Form1.Enable:=false;   ???
      

  2.   

    WM_GETFOCUS????(好象是这个消息吧,或者是WM_FOCUS,你自己找找)的时候,根据参数可以获得失去焦点的窗口,然后把焦点设回去.SetFocus好象也可以重载的.
      

  3.   

    看能不能这样变通一下:挂个钩子,定义两个HWND类型变量NewHd,OldHd,捕获每次鼠标点击的消息以及点击的地方的Handle-〉NewHd,而OldHd就是上次记录的NewHd,然后检查这个NewHd是不是自己的Handle,如果是就模拟点击一次OldHd,并把焦点设置到NewHd,而如果不是自己的Hd,就把OldHd赋值为NewHd
      

  4.   

    我试过了楼上所说的,当自己的窗口获得了焦点后,再模拟点击回原窗口,网上也有类似的程序是这样的,但都得不到好的效果。原因有以下:1、有些程序,如游戏,一但失去焦点会暂停等,即使你点击回,也不会继续。2、绐终有时间差。达不到  Windows 的虚拟键盘那种效果。
      

  5.   

    我找到一个在屏幕左上角显示时间的程序代码,可以实现不获得焦点,不知道对楼主有没有用:
    procedure ThreadProc;
    var
      hScreenDC: hdc;
      SystemTime: _SYSTEMTIME;
      Temp: string;
      MyOutput: PChar;
    begin
      while true do
      begin
        Sleep(100);
        hScreenDC := GetDC(0);
        GetLocalTime(SystemTime);
        Temp := format('Current Time is %d-%d-%d %d:%d:%d', [SystemTime.wYear,
          SystemTime.wMonth,
            SystemTime.wDay,
            SystemTime.wHour,
            SystemTime.wMinute,
            SystemTime.wSecond]);
        MyOutPut := Pchar(temp);
        TextOut(hScreenDC, 0, 0, MyOutPut, lstrlen(MyOutPut));
        ReleaseDC(0, hScreenDC);
      end;
    end;
      

  6.   

    另外关于用钩子的办法:
    我查了一下,WH_GETMESSAGE是可以修改消息的,那么这样就可以实现不让焦点转移到我的程序上而是直接留在原来的程序上了,当钩到WM_SETFOCUS消息时就作判断,判断后如果是我的Handle就修改消息,改称原来的Handle