Работа с окном с помощью дескриптора окна из другого процесса в MS Windows (XP) - PullRequest
3 голосов
/ 26 октября 2010

Можно ли выполнять некоторые операции с окном из другого процесса, имеющего его дескриптор?Я хотел бы сделать следующее: убрать оформление окна; переместить окно в любое место экрана;хороший фрагмент кода.

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 29 октября 2010

Я решил сделать еще один снимок, поэтому я экспериментировал с вашим кодом и добавил то, чего не хватало: опция -naked.

Ключ для удаления украшения пришел отсюда . Хотя это работает, вы в конечном итоге обнаружите, что приложение, которое стало голым, может начать отображать несколько ошибок после него.

Наслаждайтесь:

#include "windows.h"
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>

using namespace std;

#ifdef min
    #undef min
#endif


int main(int argc, char* argv[])
{
  char** param = argv;

  unsigned int x = numeric_limits<int>::min(), y=numeric_limits<int>::min(), w=numeric_limits<int>::min(), h=numeric_limits<int>::min();
  HWND z = HWND_NOTOPMOST;
  unsigned int flags = (SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
  ++param;

  wstring winTitle;
  bool close = false;
  bool naked = false;
  while (*param)
  {
    string sparam(*param);
    if (sparam == "-title")
    {
      ++param; 
      if (!*param) break;

      sparam = *param;
      winTitle.resize(sparam.size());
      copy(sparam.begin(), sparam.end(), winTitle.begin());
    }
    else if (sparam == "-move")
    {
      ++param; 
      if (!*param) break;

      sparam =*param;
      stringstream sstr(sparam);
      char sep;
      sstr >> x >>sep >> y;
      if (x != numeric_limits<int>::min() && y != numeric_limits<int>::min())
      {
        flags &= ~SWP_NOMOVE;
      }
    }
    else if (sparam == "-resize")
    {
      ++param; 
      if (!*param) break;

      sparam = *param;
      stringstream sstr(sparam);
      char sep;
      sstr >> w >>sep >> h;
      if (h != numeric_limits<int>::min() && w != numeric_limits<int>::min() )
      {
        flags &= ~SWP_NOSIZE;
      }
    }
    else if (sparam == "-top")
    {
      z = HWND_TOP;
      flags &= ~SWP_NOZORDER;
    }
    else if (sparam == "-staytop")
    {
      z = HWND_TOPMOST;
      flags &= ~SWP_NOZORDER;
    }
    else if (sparam == "-bottom")
    {
      z = HWND_BOTTOM;
      flags &= ~SWP_NOZORDER;
    }
    else if (sparam == "-hide")
    {
      flags |= SWP_HIDEWINDOW;
    }
    else if (sparam == "-close")
    {
      close = true;
    }
    else if (sparam == "-naked")
    {
      naked = true;
    }

    ++param;      
  }

  if (winTitle.empty())
  {
    return -1;
  }

  HWND win_handle = FindWindow(0, winTitle.c_str());    
  if (win_handle != 0)
  {
     if (close)
     {
         TerminateProcess( (HANDLE )GetProcessId( win_handle ), 0);
         return 0;
     }

     SetWindowPos( win_handle, z, x, y, w, h, flags );

     if (naked)
     {
         SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
         ShowWindow(win_handle, SW_SHOW);
     }
  }
  else
  {
      cout << "!!! FindWindow failed" << endl;
  }

  return 0;
}
1 голос
/ 26 октября 2010

Удалить оформление окна немного сложно. Я думаю, вам, вероятно, придется назначить награду за ваш вопрос.

Проверьте Windows API , чтобы увидеть, какие функции вы должны вызывать.

В любом случае, этот фрагмент должен помочь вам начать:

HWND win_handle = FindWindow (0, "Title Of The Window");    
if (win_handle != 0)
{
    /* Do your magic */

    // MoveWindow params: handle, x=100, y=200, width=400, height=450, repaint
    MoveWindow(win_handle, 100, 200, 400, 450, TRUE); 

}
else
{
    std::cout << "!!! FindWindow failed" << std::endl;
}
0 голосов
/ 28 октября 2010

Наконец, с помощью karlphillip я смог написать инструмент, который перемещает, изменяет размеры и прикрепляет окно сверху.Чего мне не хватает, так это как убрать украшение и закрыть.Вот код:

#include "windows.h"
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>
using namespace std;

#ifdef min
  #undef min
#endif

int main(int argc, char* argv[])
{
  char **param= argv;
  wstring winTitle;
  bool close = false;
  unsigned int x=numeric_limits<int>::min(), y=numeric_limits<int>::min(), w=numeric_limits<int>::min(), h=numeric_limits<int>::min();
  HWND z=HWND_NOTOPMOST;
  unsigned int flags=SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER;
  ++param;
  while ( *param )
  {
    string sparam(*param);
    if ( sparam == "-title" )
    {
      ++param; if (!*param) break;
      sparam =*param;
      winTitle.resize(sparam.size());
      copy (sparam.begin(), sparam.end(), winTitle.begin());
    }
    else if ( sparam == "-move" )
    {
      ++param; if (!*param) break;
      sparam =*param;
      stringstream sstr( sparam );
      char sep;
      sstr >> x >>sep >> y;
      if ( x != numeric_limits<int>::min() && y != numeric_limits<int>::min() )
      {
        flags &= ~SWP_NOMOVE;
      }
    }

    else if ( sparam == "-resize" )
    {
      ++param; if (!*param) break;
      sparam =*param;
      stringstream sstr( sparam );
      char sep;
      sstr >> w >>sep >> h;
      if ( h != numeric_limits<int>::min() && w != numeric_limits<int>::min() )
      {
        flags &= ~SWP_NOSIZE;
      }
    }

    else if ( sparam == "-top" )
    {
      z = HWND_TOP;
      flags &= ~SWP_NOZORDER;
    }

    else if ( sparam == "-staytop" )
    {
      z = HWND_TOPMOST;
      flags &= ~SWP_NOZORDER;
    }

    else if ( sparam == "-bottom" )
    {
      z = HWND_BOTTOM;
      flags &= ~SWP_NOZORDER;
    }

    else if ( sparam == "-hide" )
    {
      flags |= SWP_HIDEWINDOW;
    }

    else if ( sparam == "-close" )
    {
      close=true;
    }

    ++param;      
  }
  if ( winTitle.empty() )
  {
    return 1;
  }

  HWND win_handle = FindWindow (0, winTitle.c_str());    
  if (win_handle != 0)
  {

     if(close)
     {
      TerminateProcess( (HANDLE )GetProcessId( win_handle ), 0 );
      return 0;
     }

     SetWindowPos( win_handle, z, x, y, w, h, flags );
  }
  else
  {
      cout << "!!! FindWindow failed" << endl;
  }

  //system("pause");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...