C语言FindWindow和SetFocus的问题

Python09

C语言FindWindow和SetFocus的问题,第1张

FindWindow返回HWND类型的句柄。在MSDN上关于SetFocus函数的介绍,其中有一句很关键“该窗口必须与调用线程的消息队列相关。”意思就是说在窗口线程中才可以对这个窗口SetFocus(),估计你是别的线程中对查找到的窗口,然后使用SetFocus,所以失败了。

SetFocus函数的说明:

函数功能:该函数对指定的窗口设置键盘焦点。该窗口必须与调用线程的消息队列相关。

函数原型:HWND

SetFocus(HWND

hWnd)。

参数:

hWnd:接收键盘输入的窗口指针。若该参数为NULL,则击键被忽略。

返回值:若函数调用成功,则返回原先拥有键盘焦点的窗口句柄。若hWnd参数无效或窗口未与调用线程的消息队列相关,则返回值为NULL。若想要获得更多错误信息,可以调用GetLastError函数。

#include <conio.h>

#include <stdio.h>

#include <windows.h>

#include <stdlib.h> 

#include <string.h>               

struct  PCB_type

   {  char pid[100]            //进程名输入用字符串健壮性比较好

      int priority     

      int cputime

   int state

 }                     //缺少“}”

int shumu=0,pid_l      

struct PCB_type neicun[20]

struct PCB_type hc[10]

int max=0

int number=0

void create()

void run()

void huanchu()

void kill()

int main()

{

    int n,a

    n=1

 system("color  1d")

    while(n==1)

    {

      system("cls")

   printf("\n**********************************************")

   printf("\n*               进程演示系统                 *")

   printf("\n**********************************************")

   printf("\n     1.创建新的进程             2.查看运行进程")

   printf("\n     3.换出某个进程             4.杀死运行进程")                    //新增了一个唤醒功能 

   printf("\n     5.退出系统                               ")

   printf("\n**********************************************")

   printf("\n请选择(1~5):")

   scanf("%d",&a)

       switch(a)

      { case 1:

           create( ) 

    printf("\npress any key to go on~")

    getch()

         break

        case 2 :

          run() 

    printf("\npress any key to go on~")

    getch()

          break

        case 3 :

       huanchu()

    printf("\npress any key to go on~")

    getch()

         break

      case 4 :

        kill()

    printf("\npress any key to go on~")

    getch()

         break

      case 5 :

       exit(0)

         default: 

    n=1

       break

    }

       }

}

void create()  

{

       if(shumu>=20)

          {

           printf("\n内存已满,请先结束或换出进程\n")

          }

          else

          {

     shumu++

        printf("\n请输入新进程的程序名\n")

           scanf("%s",neicun[shumu-1].pid)

           printf("\n请输入新进程的优先级(数字)\n")//

           scanf("%d",&neicun[shumu-1].priority)

           printf("\n请输入新进程的需要的运行时间\n")//

           scanf("%d",&neicun[shumu-1].cputime)

     printf("\n创建进程时令其状态为就绪\n")             

     neicun[shumu-1].state=2                               //1为等待,2就绪,3为运行 

 

       }

    printf("\n创建进程成功!\n")

}

void run()

{

 if(shumu<=0)//查看//判断是否存在进程 

 {

  printf("当前状态无进程,按任意键继续创建进程\n")

     return

 }                                                 

 int max=0

 for(int i=0i<shumui++)//             

  if((neicun[i].state==2&&neicun[i].priority>=neicun[max].priority))

  {

   max=i                                                     //这里判断优先级,优先级高的进程优先执行。 

  }

  if(neicun[max].state==2)

  {

   neicun[max].state=3                                //进程运行,状态为3                                                            

   system("color  5F")

   printf("/*********************当前已有进程%d个*************************/:\n",shumu)

   for(int i=0i<shumui++){

   printf("进程编号:%d",i+1)

   printf("\n/***********正在运行进程程序名:%s*************************/\n",neicun[i].pid)

   printf("\n/***********该进程的优先级:%d*****************************/\n",neicun[i].priority)

   printf("\n/***********该进程的需要运行时间:%d***********************/\n",neicun[i].cputime)

   printf("\n/***********该进程的状态:%d(1为等待,2就绪,3为运行)******/\n\n\n",neicun[i].state)      }                 //这里增加显示当前运行的进程 

  }     

 

}

/*            换出            */

void huanchu()

{

 int k

 if(shumu<=0)//判断是否存在进程

 {

  printf("当前进程数目为0,不能执行该操作\n")

     return

 }                                             

 printf("当前已有进程%d个:\n",shumu)

 for(int h=0h<shumuh++)//当前所有的进程  

  printf("序号:%d\t程序名:%s\t优先级:%d\t运行时间:%d\t状态:%d\t\n"

  ,h,neicun[h].pid,neicun[h].priority,neicun[h].cputime,neicun[h].state)

 printf("请输入要换出程序的序号:")                                             

 scanf("%d",&k)

 if(neicun[k].state==3)

 {

  neicun[k].state=1

  printf("已被换出,进程名为:%s、状态为:[%d]",neicun[k].pid,neicun[k].state)  

    }

 else

  printf("无法换出,进程名为:%s的进程",neicun[k].pid)    //换出结果提示

}

void kill()

{

 

 if(shumu<=0)//对存在的进程进行判断

 {

  printf("当前进程数目为0,不能执行该操作\n")

     return

 }                                                             

 int k=0

 printf("/******************当前已有进程%d个******************/:\n",shumu)

 for(int h=0h<shumuh++)//当前所有的进程

  printf("序号:%d\t程序名:%s\t优先级:%d\t运行时间:%d\t状态:%d\t\n"

  ,h,neicun[h].pid,neicun[h].priority,neicun[h].cputime,neicun[h].state)

 printf("请输入要杀死程序的序号:")                                    

 scanf("%d",&k)

 neicun[k].cputime=0

 neicun[k].priority=0

 neicun[k].state=0

    if(k==(shumu-1))

   shumu--

 else{

  for(int j=k+1j<shumuj++)

    {

     strcmp(neicun[j-1].pid,neicun[j].pid)

     neicun[j-1].priority=neicun[j].priority

     neicun[j-1].cputime=neicun[j].cputime

     neicun[j-1].state=neicun[j].state

  }

        shumu--

 }

 printf("进程名为:%s已被杀死!\n",neicun[k].pid)                                //显示进程已被杀死 

 

}

消息框的函数原型:

int MessageBox(HWND hwnd,LPCTSTR lpsztext,LPCSTR lpsztitle,UINT ustyle)

消息框函数有4个参数:

第1个参数是父窗口的句柄。为NULL,说明消息框没有父窗口。

第2个参数就是一个指向要显示字符串的指针

第3个参数是消息框本身的标题。

第4个参数是指定消息框的内容和形为(即该消息框有几个按钮、文本对齐等状态,可以在20多个属性值中进行组合)

MessageBox的第4个参数可以是在WINUSER.H中定义的一组前缀以MB_开始的常数组合.

可以使用C语言的"或"(|)运算符将下面显示的三组中各选一个常数组合起来指定消息框的内容和形为:

显示哪些按钮:

#define MB_OK 0X00000000L

#define MB_OKCANCEL 0X00000001L

#define MB_ABORTRERYGNORE 0X00000002L

#define MB_YESNOCANCEL0X00000003L

#define MB_YESNO 0X00000004L

#define RERYCANCEL0X00000005L

焦点在哪个按钮上:

#define MB_DEFBUTTON1 0X00000000L

#define MB_DEFBUTTON2 0X00000100L

#define MB_DEFBUTTON3 0X00000200L

#define MB_DEFBUTTON4 0X00000300L

图示的外观:

#define MB_ICONHAND 0x00000010L

#define MB_ICONQUESTION 0x00000020L

#define MB_ICONEXCLAMATION0x00000030L

#define MB_ICONASTERISK 0x00000040L

图示的某些有替代名称:

#define MB_ICONWARNING MB_ICONEXCLAMATION

#define MB_ICONERRORMB_ICONHAND

#define MB_ICONINFORMATION MB_ICONASTERISK

#define MB_ICONSTOP MB_ICONHAND

示例:

MessageBox(NULL, "Hello, Windows!","hello", MB_OK )

MessageBox(NULL, "Hello, Windows!","HelloMsg", MB_YESNO|MB_ICONEXCLAMATION)

MessageBox(NULL, "Hello, Windows!","HelloMsg", MB_YESNO|MB_DEFBUTTON1) //表示窗口出来后焦点 focus落在Yes(第一个)按钮上