Winform窗体学习笔记 第四十篇 Application 类

1. 提供 static 方法和属性以管理应用程序,例如启动和停止应用程序、处理 Windows 消息的方法和获取应用程序信息的属性。 此类不能被继承。

2. Application 属性:

  • ExecutablePath:获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
  • StartupPath:获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。(bin/Debug)
  • UserAppDataPath:获取用户的应用程序数据的路径。

3. Application 方法:

  • Exit:通知所有消息泵必须终止,并且在处理了消息以后关闭所有应用程序窗口。 
  • Restart:关闭应用程序并立即启动一个新实例。
  • Run(Form):在当前线程上开始运行标准应用程序消息循环,并使指定窗体可见。
winform的图如下 ![图片说明](https://img-ask.csdn.net/upload/201608/08/1470647752_483698.png) 报错信息如下,抛出了Win32Exception ![图片说明](https://img-ask.csdn.net/upload/201608/08/1470647668_909727.png) ![图片说明](https://img-ask.csdn.net/upload/201608/08/1470647676_921666.png) 窗体代码如下 ``` public partial class Form1 : Form { [DllImport("C:\\Users\\Dell-pc\\Desktop\\ConsoleApplication1\\Debug\\ConsoleApplication1.dll")] protected static extern bool BeginHook(); [DllImport("C:\\Users\\Dell-pc\\Desktop\\ConsoleApplication1\\Debug\\ConsoleApplication1.dll")] protected static extern bool FinishHook(); string str=""; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { BeginHook(); } private void button2_Click(object sender, EventArgs e) { FinishHook(); } protected override void WndProc(ref System.Windows.Forms.Message msg) { str = str + msg.WParam + "\n"; label1.Text = str; } } ``` 这里导入了自己写的dll dll的cpp文件代码 ``` #include "stdafx.h" #include "ConsoleApplication1.h" #include <windows.h> HMODULE hThisDllModule; #pragma data_seg("test") HHOOK hHook=NULL; HWND hMainWindow=NULL; #pragma data_seg() LRESULT CALLBACK HandleHookMessage(int nCode, WPARAM wParam, LPARAM lParam) { PostMessage(hMainWindow, nCode, wParam, lParam); return ::CallNextHookEx(hHook, nCode, wParam, lParam); } CONSOLEAPPLICATION1_API BOOL WINAPI BeginHook() { hHook=::SetWindowsHookEx(WH_KEYBOARD, HandleHookMessage, hThisDllModule, 0); return true; } CONSOLEAPPLICATION1_API BOOL WINAPI FinishHook() { return ::UnhookWindowsHookEx(hHook); } ``` dll的h文件 ``` #ifdef CONSOLEAPPLICATION1_EXPORTS #define CONSOLEAPPLICATION1_API __declspec(dllexport) #else #define CONSOLEAPPLICATION1_API __declspec(dllimport) #endif CONSOLEAPPLICATION1_API BOOL WINAPI BeginHook(); CONSOLEAPPLICATION1_API BOOL WINAPI FinishHook(); ``` 用了def文件 ``` LIBRARY EXPORTS BeginHook FinishHook SECTIONS test Read Write Shared ``` 代码如上,这个应该是窗体代码中有哪里出错了所以启动不了窗体,但是我看不出哪里出错了,求大神指点指点
编写的程序在封装后,安装下测试机内,安装程序把程序安装在“C:\Program Files (x86)\公司名\软件名”下,程序启动时需要检查是否存在数据库文件“DATA.DB”,路径使用了“Application.StartupPath\data.db”来查找,如果不存在,则新建,还是用这个路径建立,但是新建“DATA.DB”时保存在了: C:\Users\用户名\AppData\Local\VirtualStore\Program Files (x86)\公司名\软件名\data.db 测试1:把安装后的程序目录复制到桌面,目录里没有data.db,打开程序,在桌面的程序目录里自动建立data.db; 测试2:把安装后的程序目录更名为“软件名1”,启动程序,“DATA.DB”自动建立在: C:\Users\用户名\AppData\Local\VirtualStore\Program Files (x86)\公司名\软件名1\data.db 证明:在“C:\Program Files (x86)”里的程序使用“Application.StartupPath”创建文件时都会保存在“C:\Users\用户名\AppData\Local\VirtualStore\Program Files (x86)\公司名\软件名”下。 百度: 這是虛擬轉儲,用途是如果應用程序沒有系統目錄的寫入權限,但是需要寫入文件時,系統就會把文件就會轉存到這裡,然後騙程序說存進去了,UAC就算關閉,這個功能也仍然存在(Windows目錄下的文件一律轉儲),這是爲了多用戶考慮的(任何用戶不能隨便修改系統關鍵目錄的文件). 测试3:用管理员身份启动程序,的确在“C:\Program Files (x86)\公司名\软件名”建立了数据库 疑问:测试3成功,但每次都要弹出UAC警告,由于要发送给多用户,不想说服多用户半闭UAC,怎么处理?
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页