我发现对话框的窗口类名都是#32770,我想改成一个很特殊的名字,这样,当一个程序运行前先检查当前是否已运行了本程序的一个实例,如果是就退出,当把类名改得很特殊之后,就可以用CWnd的FindWindow函数来判断是否已有实例在行,这样速度快,而且更容易(相对于使用互斥或EnumWindows函数,特别是EnumWindows函数,要用定义一个句柄和一个字符串,还涉及SetProp函数,RemoveProp函数,GetProp函数,还有一个CALLBACK EnumWndProc自定函数等),注意不能使用窗口标题来调用FindWindow函数,因为标题经常变化。我想应该在PreCreateWindow函数内更改CREATESTRUCT的lpszClass值即可,可是lpszClass必需是一个已注册过的窗口类名,那么必需要调用RegisterClass,那么在哪里调用RegisterClass呢?如果在PreCreateWindow函数内调用RegisterClass,则WNDCLASS结构的各字段基本上可以从CREATESTRUCT结构中取得,但有一个就是lpfnWndProc字段不知道怎么取得。

解决方案 »

  1.   

    转载:作者:周梦顺窗口的衍生  
     
    窗口的衍生也叫超类化,它是对一个已存在的类制作一个备份,然后修改这个备份的行为,即替换该备份类的窗口过程和其他属性,重新注册该类。这样,基于新注册的类所创建的窗口的事例,其行为将是新的窗口过程。衍生的大致过程是:用 GetClassInfo函数获得该类的信息,填入到WNDCLASS结构中, 保留原先窗口过程地址,以这个结构作为新的窗口类的起点,改变需要改变的属性及窗口过程lpfnWndProc,赋予该类一个新的类名,用RegisterClass函数注册这个新类。这样,用新注册的类建立的窗口,其行为将是修改后的行为。  
     
    窗口的衍生,将会影响基于新类创建的所有窗口的行为,而且可以接收到任何消息。当需要对许多窗口行为做同样的改变时可使用窗口的衍生。 
      

  2.   

    我在PreCreateWindow函数中用RegisterClass注册窗口,再更改CREATESTRUCT的内容,这样行吗?我担心此时对GetClassInfo的调用会失败,因为窗口还没建立。如果不在PreCreateWindow函数中做这些事,我真是不想不到还能在哪儿做!
      

  3.   

    什么样的对话框?模式对话框根本就不调用PreCreateWindow