向窗体类添加属性
本文关键字:属性 添加 窗体 | 更新日期: 2023-09-27 17:56:47
我想更改 Visual Studio 2013 的 C# 应用程序中消息框的位置。我找到了这篇文章:
http://www.codeproject.com/Tips/472294/Position-a-Windows-Forms-MessageBox-in-Csharp
它说"在您的窗体类中,添加这些 DllImport 属性。
这实际上需要我做什么?我去了我的System.Windows.Forms参考。如果那是我需要添加此代码的地方,我不知道需要将其添加到其中的位置,因为有很多我不知道的事情正在发生。
导入以下命名空间
using System.Runtime.InteropServices;
using System.Threading;
在类级别编写以下代码(如果您想对这些方法进行重新分级的信息,请参阅 pinvoke
[DllImport("user32.dll")]
static extern IntPtr FindWindow(IntPtr classname, string title);
[DllImport("user32.dll")]
static extern void MoveWindow(IntPtr hwnd, int X, int Y,int nWidth, int nHeight, bool rePaint);
[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr hwnd, out Rectangle rect);
编写FindAndMoveMsgBox
方法并在任何您想要的地方调用
在这里,我在 Form1 构造函数中调用了该方法,下面是最终代码
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern IntPtr FindWindow(IntPtr classname, string title);
[DllImport("user32.dll")]
static extern void MoveWindow(IntPtr hwnd, int X, int Y,int nWidth, int nHeight, bool rePaint);
[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr hwnd, out Rectangle rect);
public Form1()
{
InitializeComponent();
FindAndMoveMsgBox(0, 0, true, "Title");
MessageBox.Show("Message", "Title");
}
void FindAndMoveMsgBox(int x, int y, bool repaint, string title)
{
Thread thr = new Thread(() => // create a new thread
{
IntPtr msgBox = IntPtr.Zero;
// while there's no MessageBox, FindWindow returns IntPtr.Zero
while ((msgBox = FindWindow(IntPtr.Zero, title)) == IntPtr.Zero) ;
// after the while loop, msgBox is the handle of your MessageBox
Rectangle r = new Rectangle();
GetWindowRect(msgBox, out r); // Gets the rectangle of the message box
MoveWindow(msgBox /* handle of the message box */, x, y,
r.Width - r.X /* width of originally message box */,
r.Height - r.Y /* height of originally message box */,
repaint /* if true, the message box repaints */);
});
thr.Start(); // starts the thread
}
}
}
(见上面的答案 - 在我:)输入代码时发布)"DLLImport"的作用是允许您从托管代码调用非托管代码中的函数。这称为平台调用服务(或 PInvoke)
在使用 PInvoke 服务之前,我敦促您熟悉 PInvoke 及其工作原理。PInvoke 很棒,我经常使用它进行操作系统操作,例如您发布的链接。
过时了,但仍然是一个很好的教程:http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx
要回答这个问题:在 Form.cs 文件的顶部添加这些代码行(在类引用中)
public partial class MyForm : Form
{
[DllImport("user32.dll")]
static extern IntPtr FindWindow(IntPtr classname, string title); // extern method: FindWindow
[DllImport("user32.dll")]
static extern void MoveWindow(IntPtr hwnd, int X, int Y,
int nWidth, int nHeight, bool rePaint); // extern method: MoveWindow
[DllImport("user32.dll")]
static extern bool GetWindowRect
(IntPtr hwnd, out Rectangle rect); // extern method: GetWindowRect
//ETC