C语言FindWindow和SetFocus的问题

Python011

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)                                //显示进程已被杀死 

 

}

linux中有具体的函数,不用模拟,当然如果这只是一个课业,用来理解进程的一系列创建,撤销,等等的话,就另当别论了。那么切入正题,在这些操作中涉及一个控制权转移的问题,这时你要有一个system对象来管理和调度进程,system对象调度进程时,为进程实体添加一些方法,以便控制权返还给它,那么这时其它的问题都迎丸而解了,