代码之家  ›  专栏  ›  技术社区  ›  Valentin H

在MS Windows(XP)上使用来自不同进程的窗口句柄进行窗口操作

  •  3
  • Valentin H  · 技术社区  · 15 年前

    是否可以使用其他具有句柄的进程的窗口执行某些操作?我想做的是: -移除窗户装饰 -将窗口移动到屏幕的任何位置 -让窗户保持在最上面,而不显得很有格调。

    与命令行工具、脚本或C/C++代码片段的链接非常棒。

    非常感谢你!

    3 回复  |  直到 15 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    我决定再拍一张照片,所以我用你的代码做了试验,并添加了遗漏的内容:a -naked 选项。

    拆除装饰的钥匙 came from here . 虽然它可以工作,但您最终会发现,裸露的应用程序可能会在它之后开始显示一些错误。

    享受:

    #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;
    }
    
        2
  •  1
  •   karlphillip    15 年前

    拆除窗户装饰有点棘手。我想你可能得为你的问题设置一个赏金。

    检查 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;
    }
    
        3
  •  0
  •   Valentin Heinitz    15 年前

    最后,在卡尔菲利普的帮助下,我可以写一个工具,它可以移动、调整大小并在顶部粘贴一个窗口。我所缺少的是如何移除装饰和关闭。代码如下:

    #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;
    }