2013-10-09 21 views
0

我有以下的目标: 创建一个窗口按钮,点击a)切换其标签,并强制运行的Windows应用程序(例如,计算器)的前面和b)随后的点击更改其标签返回到原始状态并强制第二个Windows应用程序(例如记事本)到前面。这种切换应该可以继续无限次(直到用户中止)。如何使用WindowsFormApplication按钮在两个Windows应用程序之间切换(强制顶部)?

注意:我正在使用MS Visual Studio。

我有什么至今(建基于各种其他线程):

1)成功运行WindowsFormApplication提供了一个按钮,在一点击它,从“计算器”到“记事本”,副切换它的标签反之亦然。

2)一个Win32控制台应用程序,它成功找到正在运行的Calucalor应用程序并将其强制执行。

代码1)

ButtonSwitchApplication.cpp

// ButtonSwitchApplication.cpp : main project file. 

#include "Form1.h" 
#include <windows.h> 

using namespace ButtonSwitchApplication; 

[STAThreadAttribute] 
int main(array<System::String ^> ^args) 
{ 
    //HelloWorld(); 

    // Enabling Windows XP visual effects before any controls are created 
    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it 
    Application::Run(gcnew Form1()); 

    return 0; 
} 

Form1.h

#pragma once 
#include <windows.h> 

namespace ButtonSwitchApplication { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

    /// <summary> 
    /// Summary for Form1 
    /// </summary> 
    public ref class Form1 : public System::Windows::Forms::Form 
    { 
    public: 
     Form1(void) 
     { 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 

    protected: 
     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     ~Form1() 
     { 
      if (components) 
      { 
       delete components; 
      } 
     } 
    private: System::Windows::Forms::Button^ button1; 
    protected: 

    private: 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     System::ComponentModel::Container ^components; 

#pragma region Windows Form Designer generated code 
     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     void InitializeComponent(void) 
     { 
      this->button1 = (gcnew System::Windows::Forms::Button()); 
      this->SuspendLayout(); 
      // 
      // button1 
      // 
      this->button1->Location = System::Drawing::Point(26, 45); 
      this->button1->Name = L"button1"; 
      this->button1->Size = System::Drawing::Size(232, 53); 
      this->button1->TabIndex = 0; 
      this->button1->Text = L"INFO"; // initializes the button label with "INFO" 
      this->button1->UseVisualStyleBackColor = true; 
      this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); 
      // 
      // Form1 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->ClientSize = System::Drawing::Size(284, 261); 
      this->Controls->Add(this->button1); 
      this->Name = L"Form1"; 
      this->Text = L"Form1"; 
      this->ResumeLayout(false); 
     } 
#pragma endregion 
    private: System::Void Form1::button1_Click(System::Object^ sender,  System::EventArgs^ e) { 

     static bool isInfo = true; 
     if(isInfo == false) 
     { 
      button1->Text = "Calculator"; 

     } // end if (isInfo) 
     else 
     { 
      button1->Text = "Notepad"; 

     } // end else 
     isInfo = !isInfo; 

     } // end private button1_Click 
    }; 
} 

代码2)

Source.cpp

#include <iostream> // need this header file to support the C++ I/O system 
#include <windows.h> 

using namespace std; // telling the compiler to use namespace "std", 
      // where the entire C++ library is declared. 

int main() 
{ 

     // This code is searching for a running application 
     // Retrieves a handle to the top-level window whose class name and window name match the specified strings. 
     // This function does not search child windows. 
     // This function does not perform a case-sensitive search. 
     HWND hwnd1 = FindWindow(NULL,TEXT("Calculator")); 
     HWND hwnd2 = FindWindow(NULL,TEXT("Notepad")); 

     // used temporarily to decide which window to search for 
     int MyTemp = 0; 

     if (MyTemp == 0) { 
      SetForegroundWindow(hwnd1); 
      cout << " Found Calculator!" << endl; 
      cout << hwnd1 << endl; 
      getchar(); 
     } // end if 
     else if (MyTemp == 1) { 
      SetForegroundWindow(hwnd2); 
      cout << " Found Notepad!" << endl; 
      cout << hwnd2 << endl; 
      getchar(); 
     } // end else if 
     else { 
      cout << " Did not find the application window!" << endl; 
      cout << hwnd1 << endl; 
      getchar(); 
     } 

} 

我没有成功将1)和2)两个结合在一起,以达到上述目标。

我想包括右后

HWND hwnd = FindWindow(NULL,TEXT("Calculator")); 
SetForegroundWindow(hwnd); 
MessageBox::Show("Found Calculator!"); 

button1->Text = "Calculator"; 
在Form1.h

,但我收到这样的错误:

1> ButtonSwitchApplication.cpp 
1>ButtonSwitchApplication.obj : error LNK2028: unresolved token (0A000019) "extern "C" int __stdcall SetForegroundWindow(struct HWND__ *)" [...] 
1>ButtonSwitchApplication.obj : error LNK2028: unresolved token (0A00001E) "extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const [...] 
1>ButtonSwitchApplication.obj : error LNK2019: unresolved external symbol "extern "C" struct HWND__ * __stdcall FindWindowW(wchar_t const [...] 
1>ButtonSwitchApplication.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall SetForegroundWindow(struct HWND__ *)" [...] 

如何实现目标的任何帮助非常感谢。 谢谢!

Best, Michael。

回答

0

我想通了自己......很长一段时间后:

一对夫妇的事情是成功的关键:

  • 使用的SetForegroundWinow功能
  • 包括USER32正确的命名空间。LIB在属性>配置属性>链接>输入>附加依赖

这里是正在运行的代码,让我切换按钮带来了两个运行的应用程序在前台(在这个例子中,计算器和记事本)

ButtonSwitchApplication.cpp:

// ButtonSwitchApplication.cpp : main project file. 

#include <iostream> // need this header file to support the C++ I/O system 
#include <windows.h> 

//define the functions that do the work 
namespace ButtonSwitchApplication 
{ 
    using namespace System::Windows::Forms; 

    System::Void CalcToTop(){ 
    // This code is searching for a running application 
    // Retrieves a handle to the top-level window whose class name and window name match the specified strings. 
    // This function does not search child windows. 
    // This function does not perform a case-sensitive search. 
    HWND hwnd = FindWindow(NULL,TEXT("Untitled - Notepad")); 
    SetForegroundWindow(hwnd); 
    //MessageBox::Show("Found Notepad!"); 
} // end CalcToTop 

    System::Void NotepadToTop(){ 
    // This code is searching for a running application 
    // Retrieves a handle to the top-level window whose class name and window name match the specified strings. 
    // This function does not search child windows. 
    // This function does not perform a case-sensitive search. 
    HWND hwnd = FindWindow(NULL,TEXT("Calculator")); 
    SetForegroundWindow(hwnd); 
    //MessageBox::Show("Found Calculator !"); 
} // end CalcToTop 
} 

// includes all of the VS generated forms code 
#include "Form1.h" 

using namespace ButtonSwitchApplication; 

[STAThreadAttribute] 
int main(array<System::String ^> ^args) 
{ 

    // Enabling Windows XP visual effects before any controls are created 
    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it 
    Application::Run(gcnew Form1()); 

    return 0; 
} 

Form1.h:

#pragma once 
#include <windows.h> 

namespace ButtonSwitchApplication { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

    /// <summary> 
    /// Summary for Form1 
    /// </summary> 
    public ref class Form1 : public System::Windows::Forms::Form 
    { 
    public: 
     Form1(void) 
     { 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 

    protected: 
     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     ~Form1() 
     { 
      if (components) 
      { 
       delete components; 
      } 
     } 
    private: System::Windows::Forms::Button^ button1; 
    protected: 

    private: 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     System::ComponentModel::Container ^components; 

#pragma region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     void InitializeComponent(void) 
     { 
      this->button1 = (gcnew System::Windows::Forms::Button()); 
      this->SuspendLayout(); 
      // 
      // button1 
      // 
      this->button1->AutoSizeMode = System::Windows::Forms::AutoSizeMode::GrowAndShrink; 
      this->button1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 18, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
      static_cast<System::Byte>(0))); 

      this->button1->Dock = System::Windows::Forms::DockStyle::Fill; 
      this->button1->Location = System::Drawing::Point(0, 0); 
      this->button1->MinimumSize = System::Drawing::Size(200, 60); 
      this->button1->Name = L"button1"; 
      this->button1->Size = System::Drawing::Size(345, 86); 
      this->button1->TabIndex = 0; 
      this->button1->Text = L"CALCULATOR"; 
      this->button1->UseVisualStyleBackColor = true; 
      this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); 
      // 
      // Form1 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->ClientSize = System::Drawing::Size(345, 86); 
      this->Controls->Add(this->button1); 
      this->Name = L"Form1"; 
      this->Text = L"Form1"; 
      this->ResumeLayout(false); 

     } 
#pragma endregion 
    private: System::Void Form1::button1_Click(System::Object^ sender, System::EventArgs^ e) { 

     static bool isCalc = true; 
     if(isCalc == false) 
     { 
      button1->Text = "CALCULATOR"; 
      ButtonSwitchApplication::CalcToTop(); 
     } // end if (isInfo) 
     else 
     { 
      button1->Text = "NOTEPAD"; 
      ButtonSwitchApplication::NotepadToTop(); 

     } // end else 
     isCalc = !isCalc; 

     } // end private button1_Click 
    }; 
} 
相关问题