喂
我正在尝试做的是一种通过进程 ID 找到窗口的方法,获取该窗口的名称并将其更改为我想要的名称。
我发现了一些关于它的东西:(代码 1)
int WINAPI GetWindowText(
_In_ HWND hWnd,
_Out_ LPTSTR lpString,
_In_ int nMaxCount
);
这个:(代码 2)
CWnd* pWnd = GetDlgItem(); GetDlgIt
pWnd->SetWindowText(_T("WindowName"));
CString str;
pWnd->GetWindowText(str);
ASSERT(str == _T("WindowName"));
还有这个(代码3)
HWND WindowHandel = FindWindowA(0, "WindowName");
DWORD proccesID = 0
GetWindowThreadProcessId(WindowHandel, &proccesID);
我的问题是: 我怎样才能获得进程 ID,获得该进程的窗口名称,这样代码就可以将 Hwnd 识别为我的窗口名称并将其更改为我想要的名称。 像这样:
Process = "anyprocess.exe"
Get Process ID <
Process ID = 1234567
Get window name from the ProcessID we have <
Window name = "ILoveYou"
Change "ILoveYou" to "IHaveYou"
如果我有多个同名窗口,有一种方法可以检查第一个打开的窗口,这样我就不会更改其他窗口吗?
在我看来,从进程 ID 中获取 WindowName 似乎更安全,问题是我不想对代码说我知道窗口名称,我希望它能找到它并像 Liam Neeson 一样更改它对付那些坏人。
而且我还想知道更多关于使用那些“(0,....”或“(NULL,....”的信息,“FindWindowA”命令只是一个例子,我总是看到这个并且不要不知道如何正确使用它:
FindWindowA(0, "WindowName")
我想要的例子会对我有很大帮助 =) 感谢您的耐心等待。
最佳答案
不,这是不可能的。多个窗口可以具有相同的 PID。
但是,假设目标应用程序是单线程的,只有一个可见窗口,您可以遍历所有窗口并检查它们的 PID 以找到匹配项。您必须跳过不可见的窗口。或者更好的是,跳过非 Alt-Tab 窗口。这是它是如何完成的。
注意,我写这个只是为了好玩,我自己不会把它放在任何应用程序中。
BOOL IsAltTabWindow(HWND hwnd)
{
if (!IsWindowVisible(hwnd)) return FALSE;
HWND next = NULL;
HWND parent = GetAncestor(hwnd, GA_ROOTOWNER);
while (parent != next)
{
next = parent;
parent = GetLastActivePopup(parent);
if (IsWindowVisible(parent)) break;
}
if (next != hwnd) return FALSE;
TITLEBARINFO ti = { 0 };
ti.cbSize = sizeof(ti);
GetTitleBarInfo(hwnd, &ti);
if (ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) return FALSE;
if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) return FALSE;
return TRUE;
}
BOOL CALLBACK enumProc(HWND hwnd, LPARAM lp)
{
DWORD search_pid = DWORD(lp);
if (!IsAltTabWindow(hwnd))
return 1;
DWORD pid = 0;
GetWindowThreadProcessId(hwnd, &pid);
if (pid != search_pid) return 1;
SetWindowText(hwnd, "un-advised code");
return 0;
}
int main()
{
DWORD search_pid = 0;
HWND hwnd = FindWindow(0, "Find me");
GetWindowThreadProcessId(hwnd, &search_pid);
EnumWindows(enumProc, LPARAM(search_pid));
return 0;
}
试试下面的代码。首先运行Window 的记事本,确保只有一个记事本实例。
如果你在 Windows 10 上运行下面的代码,它不会显示一个,而是 3 个与记事本具有相同 PID 的窗口。其中 2 个窗口是不可见的,它们由操作系统使用,我们不应该触摸它们。
所以我们至少要跳过不可见的窗口。还有许多其他系统窗口,我们也不希望与它们有任何关系。
IsAltTabWindow 是避免这些窗口的好方法。这确保我们只查看可以通过 Alt-Tab 键访问的窗口。
int main()
{
HWND hwnd = FindWindow("Notepad", 0);
if (!hwnd) return 0;
DWORD search_pid = 0;
GetWindowThreadProcessId(hwnd, &search_pid);
for (hwnd = GetWindow(GetDesktopWindow(), GW_CHILD);
hwnd; hwnd = GetWindow(hwnd, GW_HWNDNEXT))
{
char buf[300];
GetWindowText(hwnd, buf, 300);
DWORD pid = 0;
GetWindowThreadProcessId(hwnd, &pid);
if (pid == search_pid)
std::cout << pid << "\n";
}
return 0;
}
关于c++ - 查找窗口并更改其名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35917056/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我