本帖最后由 fei19790920 于 2010-03-31 10:37:54 编辑

解决方案 »

  1.   

    上面的条件可能有点不清楚,改为:
    希望窗口在不设置HWND_TOPMOST时也可以不响应“显示桌面”
      

  2.   

    我实现了放一个窗体在Form1上,你看一下是不是你要效果:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
      protected
        procedure CreateParams(var Params: TCreateParams); override;
      public
      end;var
      Form1: TForm1;implementationuses Unit2;{$R *.dfm}{ TForm1 }procedure TForm1.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.Style := WS_POPUP or WS_BORDER;
      Params.ExStyle :=  WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_WINDOWEDGE;
      Params.WndParent := GetDesktopWindow;
    end;procedure TForm1.btn1Click(Sender: TObject);
    begin
      TForm2.ShowForm(Handle);
    end;end.Form2的代码:unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm2 = class(TForm)
      private
        FParHandle: THandle;
      protected
        procedure CreateParams(var Params: TCreateParams); override;
      public
        constructor Create(AHandle: THandle); reintroduce;
        class procedure ShowForm(AHandle: THandle);
      end;implementation{$R *.dfm}{ TForm2 }constructor TForm2.Create(AHandle: THandle);
    begin
      FParHandle := AHandle;
      inherited Create(Application);
    end;procedure TForm2.CreateParams(var Params: TCreateParams);
    begin
      inherited;
      Params.WndParent := FParHandle;
    end;class procedure TForm2.ShowForm(AHandle: THandle);
    var
      Form2: TForm2;
    begin
      Form2 := TForm2.Create(AHandle);
      Form2.ShowModal;
    end;end.
      

  3.   

    用勾子W屏蔽in键+D行不行?
      

  4.   


    也是思路啊。。你还可以注册win+D 热键。。如果是wind+D 就显示?
      

  5.   

    fgfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
      

  6.   

    怎么会编译不通过,我用DELPHI 7写的,提示什么编译错误。
      

  7.   

       if IsIconic(Application.Handle) then
            Openicon(application.Handle);
      

  8.   

    出了校门才知道外面的世界比我想象的NB多了  UP
      

  9.   

    問題換個問法,或許不會有這么多的誤解:如何使 win + D 快捷鍵對 本應用程序無效?有人說,注冊快捷鍵——但這會有沖突;下面是我試驗過可行的,不必使用topmost方式,也可達到目的unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender : TObject);
      private
      { Private declarations }
        fOldAppParentHandle : THandle;
        fProgManHandle : THandle;
      protected
        procedure WMSysCommand(var Message : TWMSysCommand); message WM_SYSCOMMAND;
        procedure AppRestore (Sender : TObject);
      public
      { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
      fOldAppParentHandle := GetParent(Application.Handle);
      fProgManHandle := FindWindow('Progman', nil);
      Windows.SetParent(Application.Handle, fProgManHandle);
      Application.OnRestore := AppRestore;
    end;
    procedure TForm1.WMSysCommand(var Message : TWMSysCommand);
    begin
      case (Message.CmdType and $FFF0) of
        SC_MINIMIZE : 
          Windows.SetParent(Application.Handle,fOldAppParentHandle);
        SC_RESTORE :
          Windows.SetParent(Application.Handle, fProgManHandle );
      end; {case}
      inherited;
    end;procedure TForm1.AppRestore(Sender : TObject);
    begin
      Windows.SetParent(Application.Handle, fProgManHandle);
    end;
    end.
      

  10.   

    弄个定时器,检测到自己被Minimize了就立刻Restore
      

  11.   

    Delphi的我不清楚
    你是想让该窗口永远在桌面上么?
    如果是的话,vc里面可以截获最小化消息,然后再恢复位置,可能会有闪烁。
    目前就想到这个方法。。
      

  12.   

    不知道你的意思到底是什么。我的理解是,程序运行时屏蔽win+D组合。我的资源里有个Demo,是我用VC6写的,你可以参考一下。 DLL里创建了一个低级别的钩子(注意,普通钩子可能不行!); 程序可以屏蔽任何按键!(WinXp 下无法屏蔽Ctrl+Alt+Del)。Windows平台任何开发语言都类似,你自己搞个钩子就行了。 你程序最小化之后Disable钩子就行了,恢复之后再Enable。
      

  13.   

    每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分  
    这里发言,表示您接受了CSDN社区的用户行为准则。 
    请对您的言行负责,并遵守中华人民共和国有关法律法规,尊重网上道德。 
    转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。 
      

  14.   

    wm_size 的wparam 参数标志着本次窗口状态为什么不从这里下手搞定呢
      

  15.   

    键盘钩子可以行得通
    #include "windows.h"HHOOK hhkLowLevelKybd;LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
    {
    HHOOK hkKbd;
    hkKbd=SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
    MessageBox( NULL, 
    TEXT("禁用所用键,按确定结束禁用。"),
    TEXT("禁用所用键"), MB_OK);
    UnhookWindowsHookEx(hkKbd);
    return 0;
    }LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam)
    {
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
    int i;
    BOOL bControlKeyDown = 0; switch (nCode)
    {
    case HC_ACTION:
    if(pkbhs->vkCode==VK_DELETE&& (pkbhs->flags & LLKHF_ALTDOWN) &&VK_CONTROL )
    return 1;
    for(i=1;i<255;i++)
    if(pkbhs->vkCode==i)
    return 1;
    break;
    default:
    return CallNextHookEx (hhkLowLevelKybd, nCode, wParam, lParam);
    }
    return 0;
    }